1 개의 값에서 N 개의 독립 난수 생성기를 시드하는 가장 좋은 방법


10

내 프로그램에서 큰 데이터 세트를 샘플링하는 데 사용되는 자체 RNG로 N 개의 개별 스레드를 각각 실행해야합니다. 결과를 재현 할 수 있도록이 전체 프로세스를 단일 값으로 시드 할 수 있어야합니다.

각 인덱스의 시드를 순차적으로 늘리는 것으로 충분합니까?

현재 내가 사용 numpyRandomState메르 센 트위스터 의사 난수 생성기를 사용합니다.

아래 코드 스 니펫 :

# If a random number generator seed exists
if self.random_generator_seed:
    # Create a new random number generator for this instance based on its
    # own index
    self.random_generator_seed += instance_index
    self.random_number_generator = RandomState(self.random_generator_seed)

본질적으로 사용자 입력 시드 (존재하는 경우)로 시작하고 각 인스턴스 / 스레드에 대해 실행중인 인스턴스의 인덱스 (0 ~ N-1)를 순차적으로 추가합니다. 이것이 좋은 습관인지 또는 더 좋은 방법이 있는지 모르겠습니다.


1
각 스레드가 몇 개의 의사 난수 값을 사용할지 미리 알고 있습니까, 아니면 적어도 좋은 상한 추정치를 얻을 수 있습니까?
whuber

아니 난 할 수 없어. 임계 값이 될 때까지 합산 된 영역을 샘플링합니다. 지역의 크기는 크게 다를 수 있습니다.
EricR

답변:


9

확실히 좋은 습관은 아닙니다. 예를 들어, 12345 및 12346의 루트 시드로 두 번의 런을 수행 할 때 발생하는 상황을 고려하십시오. 각 런 N-1에는 공통 스트림 이 있습니다 .

Mersenne Twister 구현 ( numpy.random및 포함 random)은 일반적으로 다른 PRNG를 사용하여 정수 시드를 MT가 사용하는 큰 상태 벡터 (624 32 비트 정수)로 확장합니다. 의 배열입니다 RandomState.get_state(). 원하는 것을 수행하는 좋은 방법은 해당 PRNG를 실행하고 입력 정수로 한 번 시드하고 N*62432 비트 정수를 얻는 것입니다. 스트림을 N상태 벡터 로 분할하고 RandomState.set_state()RandomState인스턴스 를 명시 적으로 초기화 하는 데 사용 합니다. 해당 PRNG를 얻기 위해 표준 라이브러리 의 C 소스를 참조 numpy.random하거나 _random표준 라이브러리에서 참조해야 할 수도 있습니다 (동일 함). 누군가가 PRNG for Python의 독립형 버전을 구현했는지 확실하지 않습니다.


나는 이것이 지금까지 들었던 최고의 솔루션 일 것이라고 생각합니다. 스트림을 올바르게 분할하는 방법에별로 중요하지 않다고 생각합니까? 초기 PRNG 및 시드에서 어떻게 선택 되든 인스턴스간에 624 개의 32 비트 정수에서 중복 시퀀스를 갖는 것이 훨씬 더 가능성이없는 것 같습니다.
EricR

1
사실, 나는 이것을 조금 뒤로 걸을 것입니다. 이니셜 라이저 PRNG가 임의로 많은 값을 가져 오도록 설계되었다는 것은 분명하지 않습니다. 상태 스트림을 생성하기 위해 다른 품질 PRNG (바람직하게는 MT와 관련이없는)를 사용하는 것이 좋습니다. 표준 라이브러리 만 비교적 간단하게 사용하여 HMAC-DRBG (암호 프리미티브로 HMAC를 사용하는 PRNG)를 구현할 수 있습니다. 암호화 보안은 문제가되지 않습니다. 구현의 용이성과 비트 스트림의 품질. 매우 드문 오프 기회에서 0이 아닌 벡터가 만들어지지 않도록해야합니다.
Robert Kern

또는 RandomState설정 가능한 스트림이있는 알고리즘을 사용하는 개발 에서 최신 구현 중 하나 를 사용하십시오. 즉, RandomState동일한 시드 및 다른 스트림 ID로 각 인스턴스 를 초기화하면 (간단히 증가해도 괜찮음) 독립적 인 스트림이 보장됩니다. pypi.python.org/pypi/randomstate
Robert Kern

4

병렬 처리에 사용되는 솔루션은 랜덤 생성기를 사용하는 것입니다Φ(), 어디 당신의 씨앗입니까? -배치 :

  1. 일으키다 Φ(),Φ(),Φ2(),...
  2. 일으키다 Φ2(),Φ1+(),Φ1+2(),...
  3. ...
  4. 일으키다 Φ1(),Φ1+(),Φ1+2(),...

어디 Φ()=Φ(Φ1()). 이렇게하면 단일 시드를 사용하고 시퀀스가 ​​모두 균일하고 독립적입니다.


2

이제이를 수행 하는 메소드가있는 RandomGen 이라는 Python 패키지 가 있습니다.

그것은 지원하는 하나의 씨앗,뿐만 아니라 MT19937과 같은 이전의 난수 생성기에 대한 점프 프로토콜에서 생성 된 독립적 인 스트림을.


0

어떤 사람들은 순차적 시드에 의해 생성 된 난수에 상관 관계가 있다고 주장합니다. /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-numbers 나는 그것이 얼마나 사실인지 잘 모르겠습니다.

걱정되는 경우 단일 난수 생성기를 사용하여 다른 모든 생성기의 시드를 선택하십시오.


단순히 하나 이상의 발전기에 대해 동일한 시드를 무작위로 생성 할 기회를 원하지 않기 때문입니다. 물론이 문제가 발생하지 않도록 프로그래밍 작업을 수행 할 수는 있지만 처음에 씨앗을 순차적으로 선택하는 것보다 더 나은 방법을 모르겠습니다.
EricR

1
분명히 , 순차적 인 시드와의 상관 관계가 가능합니다 ... 그러나 John D Cook의 블로그에 나온 답변에 링크 된 기사 에서 한 RNG를 사용하여 다른 생성기의 시드를 생성하는 것은 생일 문제에 빠지기 때문에 훨씬 나쁩니다! 1000 개의 16 비트 부호없는 시드를 임의로 생성하면 99.95 %의 확률이 겹치게됩니다.
Praveen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.