zenn.skin 무료버전 배포중!
자세히보기

Python/Syntax

[Python] random 모듈

koosco! 2022. 7. 18. 21:13

랜덤 함수를 사용할 때마다 다시 찾아봐야해서 정리를 해두려 합니다.

제공하는 함수가 워낙 많아서 그 중에서 자주 사용하는 함수 몇 개만 추리겠습니다. 랜덤함수에 대해 좀 더 공부하고 싶으신 분은 help(random)을 통해 도움말을 보거나, 

 

random — 의사 난수 생성 — Python 3.10.5 문서

random — 의사 난수 생성 소스 코드: Lib/random.py 이 모듈은 다양한 분포에 대한 의사 난수 생성기를 구현합니다. 정수에 대해서는, 범위에서 균일한 선택이 있습니다. 시퀀스에 대해서는, 무작위

docs.python.org

random 공식 문서를 확인하시면 좋을 것 같습니다.

 

1. choice( seq)

import random

random.choice([1, 2, 3, 4]) # 1, 2, 3, 4 중 하나의 원소를 선택

choice 함수는 iterable객체가 주어지는 경우, 그 중에 하나를 랜덤으로 선택해주는 함수입니다.

 

2. gauss(mu, sigma)

from collections import Counter

result = []
for _ in range(10_000):
    result.append(random.gauss(0, 1))
result.sort()
result = list(map(lambda x: round(x, 3), result))
c = Counter(result)

plt.figure(figsize=(12, 8), dpi=300)
plt.bar(c.keys(), c.values(), 0.1)

gauss 함수를 사용해 만든 정규분포

gauss함수는 X ~ N(mu, sigma)를 따르는 확률변수를 생성하고 확률값 하나를 반환합니다. mu와 sigma가 default값이 정해져 있지 않으므로 반드시 인자값을 전달해 주어야 합니다.

동일하게 정규분포 확률값을 생성하는 random.normalvariate보다 좀 더 빠릅니다.

하지만 멀티 쓰레드 환경에서 사용하는 경우, 동일한 반환값을 가지기 때문에 1) 서로 다른 인스턴스를 생성하거나 2) random.normalvariate 함수를 사용해야 합니다.

 

3. normalvariate(mu, sigma)

random.gauss 함수와 동일한 기능을 갖습니다. normalvariate함수는 random.gauss 함수보다 속도가 느리지만 멀티 쓰레딩 환경에서의 문제가 없다는 장점이 있습니다.

 

4. randint(a, b)

a ~ b 사이의 값을 가지는 정수값을 반환합니다. 이 때, 양 끝 a와 b도 범위에 포함됩니다.

result = []
for _ in range(10):
    result.append(random.randint(1, 3))
result

a, b도 범위에 포함된다

5. random()

[0, 1) 범위 안에서 랜덤한 난수값 하나를 반환합니다. 0은 포함되지만 1은 포함되지 않습니다.

print(random.random()) # [0, 1) 범위의 난수를 반환

 

6. randrange(start, stop=None, step=1)

result = []
for _ in range(100):
    result.append(randrange(1, 6, 2))
print(result)

randrange함수는 start부터 stop 범위 내에 해당하는 난수값 하나를 반환합니다.

step 인자를 받는 경우, range함수와 동일하게 step 간격을 가지는 난수를 생성합니다.

stop은 범위에 포함되지 않습니다.

 

하나의 인자만 받는 경우, 인자를 stop으로 받고 stop 미만의 수들 중 하나의 난수를 반환합니다.

result = []
for _ in range(10):
    result.append(randrange(3))
print(result)

3 미만의 수들 중 하나를 반환

 

 7. seed(a=None, version=2)

random을 사용해 난수를 생성하면 항상 다른 값이 나옵니다. 하지만 실험을 반복하는 경우, 계속해서 다른 결과가 나오면 실험의 결과가 맞는지 확인하기 어렵습니다. random.seed 함수는 동일한 seed값을 넣고 난수값을 구하는 경우 항상 동일한 난수값을 반환하도록 만들어줍니다.

random.seed(100)
print(random.gauss(0, 1))
random.seed(100)
print(random.gauss(0, 1))

동일한 확률변수 값을 반환함

 

8. shuffle(x, random=None)

nums = [num for num in range(1, 11)]
print(nums)
random.shuffle(nums)
print(nums)
random.shuffle(nums)
print(nums)

shuffle 함수는 리스트가 주어지면 리스트의 순서를 섞어버립니다.

 

9. uniform(a, b)

print(random.uniform(0, 1)) # [0, 1) 범위에 해당하는 난수를 반환

uniform 함수는 [0, 1) 범위에 해당하는 난수를 반환합니다. 이 때, b값은 범위에 포함되지 않습니다.

이름에서 알 수 있듯이, 모든 수들은 동일한 확률로 추출됩니다.

 

 

'Python/Syntax'의 다른글

  • 현재글 [Python] random 모듈

관련글