2012-12-24 4 views
7

내가 GCC 4.6.3 사용하고 상호 작용 다음 코드와 난수 생성하려고했다 : C++ (11 개) 임의의 숫자와 표준 : : 바인드는 예상치 못한 방법으로

#include <random> 
#include <functional> 

int main() 
{ 
    std::mt19937 rng_engine; 

    printf("With bind\n"); 
    for(int i = 0; i < 5; ++i) { 
     std::uniform_real_distribution<double> dist(0.0, 1.0); 
     auto rng = std::bind(dist, rng_engine); 
     printf("%g\n", rng()); 
    } 

    printf("Without bind\n"); 
    for(int i = 0; i < 5; ++i) { 
     std::uniform_real_distribution<double> dist(0.0, 1.0); 
     printf("%g\n", dist(rng_engine)); 
    } 

    return 0; 
} 

나는 두 가지 방법이 생성하는 예상을 5 개의 난수의 순서. 대신 실제로 얻은 것입니다.

With bind 
0.135477 
0.135477 
0.135477 
0.135477 
0.135477 
Without bind 
0.135477 
0.835009 
0.968868 
0.221034 
0.308167 

GCC 버그입니까? 또는 std :: bind와 관련된 미묘한 문제입니까? 그렇다면 결과에 대해 이해할 수 있습니까?

감사합니다.

답변

11

바인딩 할 때 rng_engine 복사본이 만들어집니다.

auto rng = std::bind(dist, std::ref(rng_engine)); 
+2

공정하지, 난에 대한 +1을 게시하기 전에 엄마로부터 전화가 있었다 속도. – nurettin

+2

젠장, 난 그냥 스마일리로 대답 할 수 없어 :) –

+0

약간 주제 떨어져,하지만 바인딩을 사용하고 각 std :: thread에 대한 참조로 생성기를 전달하려면 어떻게해야합니까? – pyCthon

5

std::uniform_real_distribution::operator()Generator & 그래서 당신이 표준을 사용하여 바인딩해야합니다 걸리는

#include <random> 
#include <functional> 

int main() 
{ 
    std::mt19937 rng_engine; 

    printf("With bind\n"); 
    for(int i = 0; i < 5; ++i) { 
     std::uniform_real_distribution<double> dist(0.0, 1.0); 
     auto rng = std::bind(dist, std::ref(rng_engine)); 
     printf("%g\n", rng()); 
    } 

    printf("Without bind\n"); 
    for(int i = 0; i < 5; ++i) { 
     std::uniform_real_distribution<double> dist(0.0, 1.0); 
     printf("%g\n", dist(rng_engine)); 
    } 
} 
2

bind() 반복입니다 :: 심판에게 : 당신이 참조를 전달하려는 경우, 이것은 당신이해야 할 것입니다 사용. 루프 외부에서 퍼팅

...

std::mt19937 rng_engine; 
std::uniform_real_distribution<double> dist(0.0, 1.0); 
auto rng = std::bind(dist, rng_engine); 

for(int i = 0; i < 5; ++i) { 
    printf("%g\n", rng()); 
} 

... 나에게 예상 된 결과를 제공합니다

0.135477 
0.835009 
0.968868 
0.221034 
0.308167