보통 사용하는 random 함수는 완전한 랜덤 함수가 아닌 공식에 의해서 만들어지는 유사 랜덤값 입니다. 따라서 seed 가 동일하면 난수의 값도 동일하게 출력 됩니다.
오늘 kotlin 에 대해서 보다 보니 secure random 이라는게 있더군요. os 의 내부 값을 이용해서 랜덤 값을 얻기 때문에 더욱 완전한 랜덤값을 얻게 됩니다.
그래서 파이썬에도 방법이 있지 않을까 검색해 보니 바로 있더군요.(이걸 왜 못봤지...?? ㅜ.ㅜ)
그래서 아주 간단히 테스트 해 봤습니다.
>>> import random
>>> random.Random(1).random()
0.13436424411240122
>>> random.Random(1).random()
0.13436424411240122
>>> random.SystemRandom(1).random()
0.6490113165803764
>>> random.SystemRandom(1).random()
0.1295135574954781
>>> random.SystemRandom(1).random()
0.7727918191932017
문서의 내용을 간단히 말하자면...SystemRandom 에 넣어주는 seed 값은 아무 의미가 없다고 합니다. OS 에서 random값을 얻기 때문입니다. 리눅스의 경우는 /dev/random, /dev/urandom 등에서 얻는 모양인데 자세한건 잘 모르겠습니다. ^^;
위의 테스트 한 내용을 보면 그냥 Random(1) 으로 같은 시드값을 준 경우엔 random 값이 동일한걸 알 수 있습니다.
SystemRandom 에서도 seed 를 '1' 로 동일하게 넣어 주었으나 시드값을 무시하고 각기 다른 랜덤값이 출력되는 걸 볼 수 있습니다.
>>> i=[i for i in range(1,20)]
>>> i
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> random.Random(1).sample(i,4)
[5, 3, 9, 4]
>>> random.Random(1).sample(i,4)
[5, 3, 9, 4]
>>> random.SystemRandom(1).sample(i,4)
[17, 11, 12, 1]
>>> random.SystemRandom(1).sample(i,4)
[6, 14, 10, 15]
>>> random.SystemRandom().sample(i,4)
[5, 7, 19, 17]
sample 을 이용해서 i 리스트에서 4개의 값을 랜덤으로 가져오게 했습니다.
일반 Random 에서는 이번에도 seed 가 같으면 가져오는 4개의 값은 동일 했습니다.
SystemRandom 을 사용했을땐 모두 다른 값을 가져옵니다. SytemRandom 은 seed 값에 영향을 받지 않음을 다시 확인할 수 있습니다.
댓글
댓글 쓰기