난수 생성 - numpy

2022. 7. 16. 00:54Programming Language/Python

난수(Random number)를 생성하는데에는 2가지 방법이 있습니다. 하드웨어 난수 생성기를 이용하는 방법과 유사난수 생성기를 이용하는 방법

 

  • 하드웨어 난수 생성기(Hardware Random Number Generator)
    물리적인 처리를 통해 예측이 불가능한 난수를 생성
    e.g. 마이크로 자연의 노이즈를 입력받아 난수 생성(갓 노이만 선생님께서 쓰신 방법)
  • 유사난수 생성기(Pseudo Random Number Generator)
    난수를 흉내내기 위한 알고리즘을 사용하는 SW
    e.g. MT19937(Mersenne Twister)

 

메르센 트위스터(Mersenne Twister)란?

유사난수 생성기 중 하나로 질 좋은 난수를 빠르게 생성할 수 있다. 그러나 암호학적으로 안전하지는 않다.
제가 알기론 numpy의 디폴트 난수 생성기가 이겁니다.

 

메르센 트위스터가 난수를 생성하는 방식은

  1. seed 값(np.random.seed()로 설정한 값)을 초기값으로 놓고 특정 점화식을 통해 624개의 값을 생성합니다.
  2. random number가 필요해지면 위의 배열에서 값을 하나씩 뽑아 임의의 변형 과정을 거친 후 리턴합니다.
  3. 624개의 값을 모두 사용했으면 twister로 새로 624개의 값을 생성합니다.

 

np.random.seed는 맨 처음 초기값으로만 쓰이므로 624개가 넘는 난수를 생성했다면 다음 624개의 값은 어떤 값일지 예측이 어렵습니다.
따라서 좀 더 세밀하게 random성을 control하고 싶은 경우에는 np.random.get_state, np.random.set_state로 624개의 배열을 통째로 저장/복원하는 방식을 쓰면 됩니다.

 

 

 

 

 

Reference

'Programming Language > Python' 카테고리의 다른 글

datetime, zoneinfo 모듈의 호환성  (0) 2025.04.16
Relative import  (0) 2025.01.12
.py 배포  (0) 2022.07.14
Miniconda 소개  (0) 2021.12.22
[분산, 병렬 처리] Ray  (0) 2021.10.20