2012-12-24 7 views
7

を対話:C++ 11個の乱数とstd ::バインドは、私はGCC 4.6.3を使用していますし、次のコードで乱数を生成しようとしていた予期しない方法で

#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()はそうあなたがSTDを使用してバインドする必要がありますGenerator &を取る:: refの繰り返しのために

#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 
関連する問題