- random은 난수를 생성하는 파이썬의 표준 라이브러리
- 의사 난수(pseudo-random) 생성기
- 완전한 랜덤이 아닌 시드(seed)기반
- 동일한 seed -> 동일한 결과
- 시드 기반으로 예측이 가능하기 때문에 보안 관련에는 사용X
실수 난수
import random
print(random.random())
import random
print(random.uniform(a, b))
정수 난수
import random
print(random.randint(a, b))
import random
print(random.randrange(start, stop, step))
- randrange: start ≤ x < stop
import random
print(random.randrange(0, 5, 2))
- range()와 동일한 방식으로 동작
- 나올 수 있는 수: 0, 2, 4
시퀀스
import random
random.choice(['sword', 'axe', 'spear'])
import random
item = random.choices(['sword', 'axe', 'spear'], k=2)
print(item)
- choices
- 리스트 중 k개 뽑아서 리스트로 리턴
- k값을 안넣으면 기본은 1개 뽑기
- 1개만 뽑아도 리스트로 리턴
- 중복으로 뽑기 허용
import random
grade = ['normal', 'rare', 'unique']
item = random.choices(grade, weights=[65,25,10], k=1)
print(item)
- choices의 파라미터중 weights로 각 리스트 요소들에 대한 가중치를 설정할 수 있음
- 리스트의 요소 갯수와 weights의 요소 갯수이 불일치할 경우 ValueError 발생
import random
nums = random.sample([1,2,3], 3)
print(nums)
[2, 3, 1]
- sample
- 여러 개 뽑기
- k값 넣어줘야함
- 리스트를 리턴함
- 중복 X
- 리스트 요소보다 뽑는 횟수가 많으면 중복을 허용하지 않기 때문에 ValueError
import random
nums = [1,2,3,4,5]
random.shuffle(nums)
print(nums)
시드
import random
random.seed(42)
print(random.randint(1, 10))
- 시드는 난수생성기의 시작 상태
- 시드가 같으면 같은 결과값이 나옴
- random은 진짜 랜덤이 아니고 seed + 알고리즘으로 숫자를 만들어내는 것
- 시드는 시간, 요청 순서, 패턴 등으로 추측 가능
- 토큰, 인증과 같은 보안에는 random이 아닌 secrets 모듈 사용
고급 분포 함수
정규 분포
import random
random.gauss(mu, sigma)
- 정규분포 기반 난수를 만들어줌(평균 주변에 값이 몰리는 랜덤 값)
- 현실적이고 자연스러운 값 변화
- mu: 평균(mean)
- sigma: 표준편차
- 정규분포
- 가운데(평균)에 값이 가장 많음
- 멀어질수록 확률 급감
- 사용
지수 분포
import random
print(random.expovariate(lambd))
- 지수 분포 기반 난수를 만들어줌
- 지수분포
- 같은 확률로 계속 시도하지만, 오래 기다리려면 계속 실패해야 해서 앞쪽에 값이 몰린다
- 값이 작을수록 많이 나옴
- 값이 커질수록 확률 급격히 감소
- Memoryless
- 지금까지 기다린 시간은 의미 없음
- 10초 기다렸어도 다음 1초안에 올 확률은 항상 동일
- 대기 시간(waiting time) 모델
- 항상 양수
- 균등 분포 아님(랜덤인데 한쪽으로 치우침)
- 사용
- 서버(API 요청 간격)
- 네트워크(패킷 도착 시간 모델링)
- 시뮬레이션