2012-12-24 14 views
7

मैं जीसीसी 4.6.3 का उपयोग कर रहा में बातचीत और निम्न कोड के साथ यादृच्छिक संख्या उत्पन्न करने के लिए कोशिश कर रहा था:सी ++ 11 यादृच्छिक संख्या और std :: बाँध अप्रत्याशित तरीके

#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 

यह एक जीसीसी बग है: इसके बजाय, इस मैं वास्तव में क्या मिलता है? या क्या यह std :: बाइंड के साथ कुछ सूक्ष्म मुद्दा है? यदि हां, तो क्या आप परिणाम का कोई अर्थ बना सकते हैं?

धन्यवाद।

उत्तर

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 
संबंधित मुद्दे