random — 의사 난수 생성
random — 의사 난수 생성
random 모듈은 다양한 분포를 위한 의사 난수 생성기를 구현해요. 정수에 대해서는 범위 내 균일 선택이 있고, 시퀀스에 대해서는 무작위 요소의 균일 선택, 리스트를 제자리에서 무작위 순열로 만드는 함수, 비복원 무작위 표본 추출 함수가 있어요. 실수 축에서는 균일, 정규(Gaussian), 로그정규, 음지수, 감마, 베타 분포를 계산하는 함수가 있고, 각도 분포 생성에는 von Mises 분포가 있어요.
본문
거의 모든 모듈 함수는 반개방 구간 0.0<=X<1.0 에서 균일하게 무작위 float 를 생성하는 기본 함수 random() 에 의존해요. 파이썬은 핵심 생성기로 Mersenne Twister 를 사용해요. 53비트 정밀도 float 를 생성하고 주기는 2**19937-1 이에요. C 의 기본 구현은 빠르고 스레드 안전해요. Mersenne Twister 는 현존하는 것 중 가장 광범위하게 테스트된 난수 생성기 중 하나예요. 그러나 완전히 결정적이므로 모든 목적에 적합하지 않고, 암호화 목적에는 전혀 부적합해요.
이 모듈이 제공하는 함수는 실제로 random.Random 클래스의 숨은 인스턴스의 바인딩된 메서드예요. 자체 Random 인스턴스를 만들어 상태를 공유하지 않는 생성기를 얻을 수 있어요. Random 클래스는 다른 기본 생성기를 사용하고 싶다면 하위 클래스화할 수도 있어요.
random 모듈은 운영체제가 제공하는 소스에서 os.urandom() 시스템 함수로 난수를 생성하는 SystemRandom 클래스도 제공해요.
⚠️ 경고: 이 모듈의 의사 난수 생성기는 보안 목적에 사용하면 안 돼요. 보안 또는 암호화 용도는
secrets모듈을 참고하세요.
참고: 전역 난수 생성기와 Random 인스턴스는 스레드 안전해요. 그러나 free-threaded 빌드에서는 전역 생성기나 같은 Random 인스턴스에 대한 동시 호출이 경합(contention)과 성능 저하를 겪을 수 있어요. 스레드마다 별도의 Random 인스턴스 사용을 고려하세요.
관리 함수 (Bookkeeping functions)
- random.seed(a=None, version=2) — 난수 생성기를 초기화해요. a 가 생략되거나
None이면 현재 시스템 시간을 사용해요. 운영체제가 난수 소스를 제공하면 시스템 시간 대신 그것을 사용해요. a 가 int 면 그 절댓값을 직접 사용해요. version 2(기본)에서는str,bytes,bytearray객체가int로 변환되고 그 모든 비트가 사용돼요. - random.getstate() — 생성기의 현재 내부 상태를 캡처한 객체를 반환해요.
setstate()에 전달해 상태를 복원할 수 있어요. - random.setstate(state) — state 는 이전
getstate()호출에서 얻어야 하며,getstate()가 호출된 시점의 내부 상태로 생성기를 복원해요.
bytes 용 함수
- random.randbytes(n) — n 개의 무작위 바이트를 생성해요. 보안 토큰 생성에는 쓰면 안 되고
secrets.token_bytes()를 사용하세요. 버전 3.9 추가.
정수용 함수
- random.randrange(start, stop[, step]) —
range(start,stop,step)에서 무작위로 선택된 요소를 반환해요.choice(range(start,stop,step))와 대략 동등하지만 임의로 큰 범위를 지원하고 일반적인 경우에 최적화돼 있어요. 키워드 인자는 예상치 못한 방식으로 해석될 수 있어 쓰면 안 돼요. 버전 3.12부터 비정수 타입의 자동 변환은 더 이상 지원되지 않아요. - random.randint(a, b) —
a<=N<=b인 무작위 정수 N 을 반환해요.randrange(a,b+1)의 별칭. - random.getrandbits(k) — k 개의 무작위 비트를 가진 음이 아닌 파이썬 정수를 반환해요.
시퀀스용 함수
- random.choice(seq) — 비어 있지 않은 시퀀스 seq 에서 무작위 요소를 반환해요. seq 가 비면
IndexError를 발생시켜요. - **random.choices(population, weights=None, *, cum_weights=None, k=1) — population 에서 복원 추출로 선택한 k 크기 리스트를 반환해요. weights 시퀀스를 지정하면 상대 가중치에 따라 선택하고, cum_weights 는 누적 가중치에 따라 선택해요. 둘 다 지정하면
TypeError, 모든 가중치가 0이면ValueError. 버전 3.6 추가. - random.shuffle(x) — 시퀀스 x 를 제자리에서 섞어요. 불변 시퀀스는
sample(x, k=len(x))를 사용하세요. 짧은 시퀀스에도 x 의 전체 순열 수는 대부분 난수 생성기의 주기보다 빠르게 커질 수 있어요. 예를 들어 길이 2080 의 시퀀스가 Mersenne Twister 주기 안에 들어갈 수 있는 가장 큰 값이에요. 버전 3.11에서 선택적 매개변수 random 제거. - **random.sample(population, k, *, counts=None) — 비복원 무작위 표본 추출로 인구 시퀀스에서 고유한 요소의 k 길이 리스트를 반환해요.
실제 값 분포 (Real-valued distributions)
모듈은 random() 에 기반해 uniform(), triangular(), normalvariate(), lognormvariate(), expovariate(), gammavariate(), betavariate() 등의 실수 분포 함수와, 각도 분포 vonmisesvariate() 를 제공해요. 기본 random() 은 0.0 ≤ x < 1.0 범위에서 2⁻⁵³ 의 배수를 반환하는데, 이는 모두 균등하게 분포되고 파이썬 float 로 정확히 표현돼요. 더 넓은 실수 선택이 필요하면 Random 을 하위 클래스화한 FullRandom 레시피처럼 random() 을 재정의할 수 있어요.
커맨드라인 사용법 (Command-line usage)
random 모듈은 커맨드라인에서 실행할 수 있어요. 버전 3.13 추가.
python -m random [-h] [-c CHOICE [CHOICE ...] | -i N | -f N] [input ...]
- -c, --choice —
choice()로 무작위 선택을 출력. - -i, --integer
— randint()로 1~N 의 무작위 정수 출력. - -f, --float
— uniform()으로 0~N 의 무작위 부동소수점 출력.
옵션이 없으면 입력에 따라 문자열/복수는 --choice, 정수는 --integer, float 는 --float 와 동일하게 동작해요.