많은 컴퓨터 애플리케이션에서 난수(random number) 생성이 필요합니다. 하지만 컴퓨터는 진정한 의미의 무작위 숫자를 만들어낼 수 없습니다. 다른 프로그래밍 기법과 마찬가지로 Python 역시 의사 난수 생성기(pseudo-random generator)를 사용합니다.
Python의 난수 생성은 메르센 트위스터(Mersenne Twister) 알고리즘을 기반으로 하며, 53비트 정밀도의 부동소수점(float) 값을 생성합니다. 이 방식은 속도가 빠르고 스레드에 안전(thread-safe)하다는 장점이 있지만, 예측 가능성이 있기 때문에 암호화 목적으로는 적합하지 않습니다.
Python 표준 라이브러리에는 다양한 난수 관련 함수를 제공하는 random 모듈이 포함되어 있습니다. 지금부터 주요 함수들을 하나씩 살펴보겠습니다.
1. 생성기 상태 제어 함수
random.seed()
난수 생성기를 초기화하는 함수입니다. random 모듈을 임포트하면 시스템 시간을 기반으로 생성기가 자동 초기화됩니다. 생성기를 다시 설정(reseed)하려면 int, str, bytes 또는 bytearray 객체를 인자로 전달하면 됩니다.
random.getstate()
난수 생성기의 내부 상태를 반환하는 함수입니다. setstate() 함수와 함께 사용하면 동일한 난수 데이터를 반복해서 재현할 수 있어 테스트나 디버깅에 유용합니다.
random.setstate()
getstate()로 저장해 둔 내부 상태를 복원하여 생성기를 이전 시점의 상태로 되돌리는 함수입니다.
2. 정수형 난수 생성 함수
random.randrange()
주어진 범위 내에서 임의의 정수를 생성합니다. 최대 세 개의 매개변수를 받을 수 있습니다.
random.randrange(start, stop, step)
start와 step은 선택 사항이며, 기본값은 각각 0과 1입니다. step은 연속된 숫자 사이의 간격을 결정합니다.
>>> random.randrange(10) 5 >>> random.randrange(10, 20) 17 >>> random.randrange(100, 200, 2) 188
참고: 위 코드의 출력 결과는 무작위로 생성되기 때문에 실행할 때마다 다를 수 있습니다.
random.randint()
두 매개변수 사이의 임의의 정수를 생성합니다. randrange()에서 step 매개변수가 빠진 형태와 유사하며, 시작 값(start)은 필수로 지정해야 합니다.
>>> random.randint(1, 10) 6 >>> random.randint(100, 200) 134
3. 실수형(부동소수점) 난수 생성 함수
random.random()
0.0 이상 1.0 미만 범위의 부동소수점 난수를 생성합니다.
>>> random.random() 0.668544544081956
random.uniform()
두 매개변수 사이의 부동소수점 난수를 반환합니다. 인자의 순서가 바뀌어도 정상 동작합니다.
>>> random.uniform(0.5, 1.5) 1.2760281470664903 >>> random.uniform(1, 10) 7.336985794193224 >>> random.uniform(10, 5) 7.817794757786727
4. 시퀀스 객체를 다루는 함수
다음 함수들은 문자열(string), 리스트(list), 튜플(tuple)과 같은 시퀀스 객체에 적용됩니다.
random.choice()
시퀀스에서 요소 하나를 무작위로 선택합니다. 시퀀스가 비어 있으면 IndexError가 발생합니다.
>>> random.choice("Tutorialspoint")
'o'
>>> random.choice(range(10))
2
>>> random.choice([15, 31, 6, 29, 55, 5])
55
>>> random.choice((15, 31, 6, 29, 25, 55))
15random.choices()
시퀀스에서 여러 개의 요소를 무작위로 추출합니다. 첫 번째 매개변수는 대상 시퀀스이며, 두 번째 매개변수(k)는 선택할 요소의 개수입니다. 중복 선택이 허용됩니다.
>>> name = "TutorialsPoint" >>> random.choices(name, k=2) ['T', 'o']
random.shuffle()
변경 가능한(mutable) 시퀀스의 요소 순서를 제자리에서 무작위로 섞습니다. 원본 리스트가 직접 변경된다는 점에 유의하세요.
>>> num = [10, 20, 30, 40, 50] >>> random.shuffle(num) >>> num [50, 20, 40, 30, 10]
random.sample()
변경 불가능한(immutable) 시퀀스에도 사용할 수 있는 함수로, 원본 시퀀스는 그대로 둔 채 무작위로 선택된 요소들의 새 리스트를 반환합니다. 중복 없이 추출됩니다.
>>> name = "TutorialsPoint"
>>> nm = random.sample(name, k=2)
>>> name, nm
('TutorialsPoint', ['i', 'a'])마무리
Python의 random 모듈은 정수, 실수, 시퀀스 조작까지 폭넓은 난수 생성 기능을 제공합니다. 단, 메르센 트위스터 알고리즘 기반이므로 보안이 중요한 애플리케이션에서는 secrets 모듈 같은 암호학적으로 안전한 대안을 사용하는 것이 좋습니다.