[Python3] 유사난수

Alexandria·2023년 9월 4일

Python3 Advanced

목록 보기
3/27
post-thumbnail

random

🔢난수

0.0 이상 1.0 미만의 실수 형은 random 함수를 사용하여 얻을 수 있습니다.

import random
print(random.random())

범위를 지정하고 싶다면 uniform 함수를 사용합니다.

마찬가지로 ax<ba \le x < b를 만족하는 xx(실수형)가 반환됩니다.

import random
print(random.uniform(a=2.0, b=5.0))

실수형이 아닌 정수형 난수를 생성해 볼 수 있습니다.

randrange 함수를 사용하면 startx<stopstart \le x < stop을 만족하는 xx(정수형)가 반환됩니다.

import random
print(random.randrange(start=2, stop=5))

randrange에 3번째 인자인 step을 설정하면 부분 범위를 얻을 수 있습니다.

import random
print(random.randrange(start=2, stop=10, step=2))

💡 다음은 2,4,6,8 중 하나의 정수가 반환됩니다.

randrange의 마지막이 미만이라면 randint는 이하로 설정됩니다.

즉, axba \le x \le b를 만족하는 xx(정수형)가 반환됩니다.

import random
print(random.randint(a=1, b=5))

선택

choice 함수를 사용하면 인자로 전달된 Sequence 중 1개의 값을 선택하여 반환합니다.

import random
print(random.choice([1,2,3,4,5]))
print(random.choice((1,2,3,4,5)))
print(random.choice("Hello World"))

sample 함수를 사용하면 선택할 수 있는 개수(k)를 설정할 수 있으며 선택된 값들이 list 형태로 반환합니다.

import random
print(random.sample(population=[1,2,3,4,5], k=2))
print(random.sample(population=(1,2,3,4,5), k=2))
print(random.sample(population="Hello World", k=2))

🎰섞기

shuffle 함수를 사용하면 전달된 Sequence의 순서를 섞을 수 있습니다.

import random
data    = [i for i in range(11)]
random.shuffle(data)
print(data)

sample 함수는 임의의 순서로 섞인 Sequence에서 임의의 개수(k)를 선택할 수 있는 함수입니다.

import random
data    = [i for i in range(11)]
print(random.sample(population=data, k=3))

💡 개수(k)를 Sequence의 길이만큼 설정하면 shuffle과 같은 효과를 낼 수 있습니다.

🧬비밀번호 생성기

string 모듈을 이용하여 만든 Sequence를 생성해 봅니다.

TypeValue
string.ascii_lettersabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits0123456789
string.punctuation!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

비밀번호의 길이를 8자리로 설정한다고 가정 후 sample 함수를 이용하여 비밀번호를 생성해 볼 수 있습니다.

import random
import string
print("".join(random.sample(population=string.ascii_letters + string.digits + string.punctuation, k=8)))

secrets

🔢난수

randbelow 함수를 사용하면 0x<n0 \le x < n을 만족하는 x(정수형)가 반환됩니다.

import secrets
print(secrets.randbelow(exclusive_upper_bound=1))

randbits도 정수형을 반환하는 함수이지만 bit를 통해서 난수를 생성합니다.

kk가 2면 00002x001120000_2 \le x \le 0011_2를 만족하는 정수가 반환되며

kk가 3이면 00002x011120000_2 \le x \le 0111_2를 만족하는 정수가 반환되는 식입니다.

import secrets
print(secrets.randbits(k=2))

random 보다 안전한 PRNG이므로 암호화 키를 생성하는 등 중요한 값을 생성할 때는

secrets 모듈을 사용하는 것이 좋습니다.

import secrets
print(secrets.token_bytes(nbytes=16))
print(secrets.token_hex(nbytes=16))
print(secrets.token_urlsafe(nbytes=16))

secrets을 사용할 수 없다면, os.urandom을 사용하면 됩니다.

secrets의 구성을 살펴보면 os.urandom을 사용하기 때문입니다.

def token_bytes(nbytes=None):
    """Return a random byte string containing *nbytes* bytes.

    If *nbytes* is ``None`` or not supplied, a reasonable
    default is used.

    >>> token_bytes(16)  #doctest:+SKIP
    b'\\xebr\\x17D*t\\xae\\xd4\\xe3S\\xb6\\xe2\\xebP1\\x8b'

    """
    if nbytes is None:
        nbytes = DEFAULT_ENTROPY
    return os.urandom(nbytes)

💡 token_hex와 token_urlsafe도 os.urandom을 사용합니다.

🤏선택

choice 함수를 사용하면 인자로 전달된 Sequence 중 1개의 값을 선택하여 반환합니다.

import secrets
print(secrets.choice(seq=[1,2,3,4,5]))
print(secrets.choice(seq=(1,2,3,4,5)))
print(secrets.choice(seq="Hello World"))

🧬비밀번호 생성기

string 모듈을 이용하여 만든 Sequence를 생성해 봅니다.

TypeValue
string.ascii_lettersabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits0123456789
string.punctuation!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

비밀번호의 길이를 8자리로 설정한다고 가정 후 choice 함수를 이용하여 비밀번호를 생성해 볼 수 있습니다.

import secrets
import string
print("".join(secrets.choice(seq=string.ascii_letters + string.digits + string.punctuation) for i in range(8)))
profile
IT 도서관

0개의 댓글