22.2 재현성

실습 · 연습문제 1개

이름으로 정해지는 난수 스트림 keyed-rng-streams

실험 코드는 여러 용도로 난수를 쓴다. 가중치 초기화, 데이터 순서, 증강, dropout, 평가용 부분표본. 이들이 전역 난수 생성기 하나를 나눠 쓰면, 한 용도에 코드 한 줄을 추가했을 때 다른 용도의 난수까지 모두 바뀐다(본문 셀 1).

함수 make_streams(seed, names)를 완성한다. 실험 seed(정수)와 용도 이름의 리스트를 받아 {이름: numpy.random.Generator}를 반환한다. 각 스트림은 (seed, 이름)만으로 정해져야 한다.

  • 같은 seed와 같은 이름이면 언제 만들어도 같은 난수를 낸다.
  • 다른 이름이 목록에 추가되거나 빠지거나, 목록의 순서가 바뀌어도 기존 이름의 스트림은 바뀌지 않는다.
  • 이름이 다르면, 또는 seed가 다르면 다른 스트림이다.

힌트: np.random.SeedSequence는 정수 리스트를 entropy로 받는다(np.random.SeedSequence([seed, k])). 이름을 정수 k로 바꾸는 방법이 필요하다.

주의: Python 내장 hash("init")은 쓰지 않는다. 문자열의 hash는 보안 때문에 프로세스마다 다른 값을 낸다(환경변수 PYTHONHASHSEED로 고정하지 않는 한). 한 프로세스 안에서 도는 테스트는 통과해도, 다음 날 다시 실행하면 다른 스트림이 나온다. hashlib처럼 입력 바이트만으로 정해지는 함수를 쓴다.