c++ - Using boost::random and getting same sequence of numbers -
मेरे पास निम्न कोड है:
वर्ग बी {शून्य जनरेटर () {// यादृच्छिक संख्या जनरेटर को बढ़ावा देने :: एमटी19937 रैंडजन (स्थिर_कास्ट & lt; अहस्ताक्षरित अंतर & gt; (std :: समय (0))); को बढ़ावा देने :: normal_distribution & LT; फ्लोट & gt; शोर (0,1); Boost :: variate_generator & lt; boost :: mt19937, बढ़ावा :: सामान्य_डिस्ट्रीबंदी & lt; float & gt; & Gt; एनडी (रैंडजेन, शोर); के लिए (इंट आई = 0; आई & lt; 100; i ++) {value = nD (); // प्रत्येक मान ग्राफ}}}; क्लास ए {शून्य से कुछ फंक्शन () (के लिए (इंट आई = 1; आई & lt; = 3; i ++) {std :: shared_ptr & lt; B & gt; ख; बी। रीसेट (नया बी ()); बी & gt; जनरेटर (); }}};
मैं कई रेखांकन बनाने के लिए तेजी से उत्तराधिकार में उपरोक्त कोड को कई बार निष्पादित करना चाहता हूं। मैंने स्टैकेवरफ्लो प्रश्न की समीक्षा भी की है जो कि समान है लेकिन चेतावनी बताती है कि जब समय (0) का उपयोग किया जाता है और सदस्य फ़ंक्शन को तेजी से उत्तराधिकार में कहा जाता है तो आपको अभी भी संख्याओं की समान अनुक्रम प्राप्त होगी।
कैसे क्या मैं इस समस्या को दूर कर सकता हूं?
संपादित करें: मैंने कक्षा बी में रैंडजेन स्थिर बनाने की कोशिश की, उसने कक्षा ए में एक वैश्विक वैरिएबल बनाने की भी कोशिश की, लेकिन हर बार 3 ग्राफ़ अभी भी वही हैं मैंने GetSystemTime मिलीसेकंड्स से बीइंग की भी कोशिश की है। मुझे कुछ याद किया जाना चाहिए।
एक बार आप निष्पादित हर बार यादृच्छिक संख्या जनरेटर शोध नहीं किया जाएगा तुम्हारा कोड।
जनरेटर और बीज इसे एक बार बनाएं, फिर इसे अभी जारी रखें।
ऐसा लगता है कि आप उस कोड को एक ही बार में कई बार बुला रहे हैं । यदि आप कई रन कर रहे हैं (लेकिन अभी भी उसी सेकंड के भीतर), तो आप बीए बदलने के लिए प्रोसेस आईडी जैसे एक और भिन्न संपत्ति का उपयोग कर सकते हैं।
वैकल्पिक रूप से, आप प्लेटफॉर्म पर निर्भर हो सकते हैं, या तो getTimeOfDay
मिलिसेकंड्स में से एक तत्व के साथ SYSTEMTIME संरचना लौटाता है।
Windows:
<पूर्व> # शामिल करें & lt; windows.h & gt; सिस्टमटाइम सेंट; GetSystemTime (& amp; सेंट); // बीज के लिए st.wSecond * 100 + st.wMillisecs का उपयोग करें (0 से 5999 9)।
लिनक्स:
#include & lt; sys / time.h & gt; संरचना समयरेखा टीवी; Gettimeofday (& amp; टीवी, NULL); // उपयोग करें tv.tv_sec * 100 + (tv.tv_usec / 1000) बीज (0 से 59999)।
Comments
Post a Comment