2014-12-15 1 views
7

std :: mt19937_64로 난수 시퀀스를 생성 중입니다. GCC와 Clang을 동일한 플랫폼에서 동일한 시드로 실행할 때 나는 다른 시퀀스를 얻는다는 것을 알았습니다. Valgrind를 통해 프로그램을 실행했으며 초기화되지 않은 메모리가 없음을 발견했습니다.메르 센 트위스터의 컴파일러 간 재현성

std :: mt19937_64를 사용하여 컴파일러간에 또는 플랫폼간에 재현성을 보장합니까?

편집 : 표준과 실행 :: normal_distribution

+3

크로스 컴파일러와의 호환성이 필요한 경우 [Boost.Random] (http://www.boost.org/doc/libs/1_57_0/doc/html/boost_random.html)을 사용할 수 있습니다. –

+0

아마도 저는 여기서 조금 순진하지만, 같은 알고리즘과 동일한 매개 변수를 사용하는 경우 논증 할 수 있듯이 동일한 시퀀스를 재생해서는 안됩니까? – Rufflewind

+3

정규 분포를 사용하고 있기 때문에 기본적으로 내 대답은 아니지만 기본 엔진은 복제본처럼 일관성이 있어야합니다. [answer here] (http://stackoverflow.com/a/24554535/1708801)를 참조하십시오. –

답변

10

엔진이 구현에서 재현성을 보장받을 수 있습니다 생성하는 것을 숫자는하지만 분포는 없습니다. (출처 : rand() considered harmful).

normal_distribution 난수 분포 확률 밀도 함수

enter image description here

에 따른 분산 난수 X를 생성한다 :

N3337 표준안이 약 normal_distribution (26.5.8.5.1)라고

분포 매개 변수 μ 및 σ는이 분포의 평균 및 표준 편차로도 알려져 있습니다.

그리고 ... 그게 전부입니다. 생성 된 숫자의 순서 나 알고리즘, 예제 출력을 지정하지 않습니다.

표준은 매우 정교하며 mersenne_twister_engine (26.5.3.2)이며, 상태 전이 함수, 초기 시드 알고리즘 등을 지정합니다.

+1

함수가 시드를 처리하는 방법의 차이로 인해 발생 했습니까? –

+1

방정식이 잘못되었습니다. 네가 잘못된 링크를 골랐다 고 생각해. – rubenvb

+0

@ Mr.Llama 나는 그렇게 생각하지 않습니다. 표준은 시딩이 어떻게 작동해야하는지에 대해 매우 정교합니다. – milleniumbug

관련 문제