2011-11-22 1 views
2

부스트 C++ uniform_01 함수와 Mersenne Twister 알고리즘을 사용하여 0과 1 사이의 임의의 실수를 생성하려고합니다. 이것은 내 코드입니다.boost C++에서 Mersenne Twister 알고리즘을 사용하여 0과 1 사이에서 동일한 난수를 생성합니까?

double random01(mt19937 & generator) 
{ 
    uniform_01<mt19937> dist(generator); 
    return dist(); 
} 

int main() 
{ 
    mt19937 generator(time(0)); 
    for (int i = 0; i < 10; i++) { 
     cout << random01(generator) << endl; 
    } 
    return 0; 
} 

그러나이 코드는 루프 반복마다 동일한 난수를 생성합니다. 나는 이것이 this question의 반복 인 것을 안다. 그러나 그 질문은 모호한 것에 대해 닫혔다. 그래서 나는 그것을 바꿨다.

+0

매크로에 대해 'uniform_01'을 루프 – Dani

답변

4

이것은 배포본을 사용하는 방법이 아닙니다. 보기 다음과 같습니다 :

#include <random> 
#define abusing using 

abusing namespace std; 

double random01(mt19937 & engine) 
{ 
    uniform_real_distribution<double> u01; // same as u01(0.0, 1.0); see Note below 
    return u01(engine); 
} 

int main() 
{ 
    // as before 
} 

당신이 볼 수 있듯이 당신이 그것을 글로벌, 혹은 정적 변수 있도록하는 것 같아서 사실 때문에, 분산 객체가, 다른 모든 것들과 무관합니다.

은 ( uniform_01 최종 표준 안으로 들어가지는 못했습니다 있습니다,하지만 간격 대신 uniform_real_distribution의 기본 생성자 기본적으로 [0, 1]. 기존의 부스트 클래스의 경우는 유사한 접근 방법을 사용할 수 있습니다.)

+2

+1에서 꺼내보십시오. –

+0

그게 완벽하게 작동하고, 설명서에 대한 주셔서 감사합니다; 나는'uniform_01'이 배포본의 공식적인 부분이 아니라는 것을 깨닫지 못했지만, 더 일반적인'uniform_real'을 사용하는 것이 가장 좋습니다. –

+1

@pythonscript : 글쎄 Boost에 감추어 져있는 한별로 중요하지 않지만, 결국 std로 옮기고 싶다면 올바른 습관을 고르는 것이 좋다! :-)''인터페이스는 TR1과 Boost 이후 몇 가지 변화를 겪었으므로 읽을 가치가 있습니다. 특히, 모든 엔진은 이제'_engine', 모든 배포판은'_distribution '이라고 부릅니다. 오, 이런, 실제로 잘못 됐어. 고쳐 줘! –

2

함수 외부에 uniform_01을 만듭니다. 연속 번호를 얻으려면 동일한 인스턴스에서 작업해야합니다. 또는 정적으로 만들 수 있습니다.

관련 문제