2009-10-28 5 views
11

하나의 특정 정규 분포에서 난수를 생성하기 위해 다음 코드를 사용할 수있는 것 같다 그러나,, 다른 변량 발전기 같은 난수 생성기를 사용하는이

float mean = 0, variance = 1; 
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0))); 
boost::normal_distribution<float> noise(mean, variance); 
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise); 

float random = nD(); 

이 잘 작동, I

float mean1 = 0, variance1 = 1, mean2 = 10, variance2 = 0.25; 
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0))); 
boost::normal_distribution<float> noise1(mean1, variance1); 
boost::normal_distribution<float> noise2(mean2, variance2); 
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise1); 
variate_generator<mt19937, normal_distribution<float> > nC(randgen, noise2); 

float random1 = nD(); 
float random2 = nC(); 

그러나, 문제는 노스 다코타()와 nC의()는 숫자의 유사한 시퀀스를 생성하는 것으로 나타납니다 : 여러 배포판에서 숫자를 그릴 수 있도록하고 싶습니다, 즉 하나는 뭔가처럼 생각하는 것입니다. Variate_generator의 생성자가 명시 적으로 사용하지 않고 randgen의 복사본을 만드는 것처럼 보였기 때문에이 문제를 가정했습니다. 따라서 동일한 의사 - 무작위 순서가 생성되고 다른 변형을 통해 간단하게 푸시됩니다 (분포의 다른 매개 변수로 인해).

부스트 (Boost)에서 단일 난수 생성기를 만들고 여러 배포판에 사용하는 방법이 있는지 아는 사람 있습니까? 또는 Boost 임의 라이브러리의 디자인은 사용자가 배포마다 하나의 난수 생성기를 만들려고합니까? 분명히, 임의의 분포로부터 시퀀스에 균일 한 난수 시퀀스를 변환하는 코드를 작성할 수는 있지만 라이브러리에 이미 내장되어있는 것을 찾고 있습니다.

미리 도움을 주셔서 감사합니다.

답변

11

귀하의 가설이 맞습니다. 두 variate_generator 인스턴스가 동일한 난수 생성기 인스턴스를 사용하기를 원합니다. 따라서 mt19937에 대한 참조를 템플릿 매개 변수로 사용하십시오.

variate_generator<mt19937 &, normal_distribution<float> > nD(randgen, noise1); 
variate_generator<mt19937 &, normal_distribution<float> > nC(randgen, noise2); 

분명히 당신은 nDnC 전에 범위를 벗어난하지 않습니다 randgen을 확인해야합니다.

+0

완벽하게 작동하는 것으로 보입니다. 첫 번째 템플릿 매개 변수를 만들면 난수 생성기의 내부 저장소가 참조로 변경됩니까? 감사. – RandomGuy

+1

예. variate generator 클래스는 비교적 간단합니다. 원래 인스턴스화 된 클래스는 'mt19937' 유형의 멤버 변수를가집니다. 올바른 하나는'mt19937 '을 입력하는 멤버 변수입니다. 추가 변경이 발생하지 않습니다. – AFoglia

+1

mt19937에 대한 참조를 사용하면 variate generator가 할당되지 않습니다. 할당이 필요하면 대신 포인터 유형을 사용할 수 있습니다. 나는. variate_generator > nD (...); –

관련 문제