
0.0 이상 1.0 미만의 실수 형은 random 함수를 사용하여 얻을 수 있습니다.
import random
print(random.random())
범위를 지정하고 싶다면 uniform 함수를 사용합니다.
마찬가지로 를 만족하는 (실수형)가 반환됩니다.
import random
print(random.uniform(a=2.0, b=5.0))
실수형이 아닌 정수형 난수를 생성해 볼 수 있습니다.
randrange 함수를 사용하면 을 만족하는 (정수형)가 반환됩니다.
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는 이하로 설정됩니다.
즉, 를 만족하는 (정수형)가 반환됩니다.
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를 생성해 봅니다.
| Type | Value |
|---|---|
| string.ascii_letters | abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ |
| string.digits | 0123456789 |
| string.punctuation | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
비밀번호의 길이를 8자리로 설정한다고 가정 후 sample 함수를 이용하여 비밀번호를 생성해 볼 수 있습니다.
import random
import string
print("".join(random.sample(population=string.ascii_letters + string.digits + string.punctuation, k=8)))
randbelow 함수를 사용하면 을 만족하는 x(정수형)가 반환됩니다.
import secrets
print(secrets.randbelow(exclusive_upper_bound=1))
randbits도 정수형을 반환하는 함수이지만 bit를 통해서 난수를 생성합니다.
가 2면 를 만족하는 정수가 반환되며
가 3이면 를 만족하는 정수가 반환되는 식입니다.
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를 생성해 봅니다.
| Type | Value |
|---|---|
| string.ascii_letters | abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ |
| string.digits | 0123456789 |
| 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)))