2017-05-17 6 views
14

this पोस्ट के अनुसार, std::random_device के साथ अंतर्ज्ञानी बीजिंग अपेक्षित परिणाम नहीं दे सकता है। विशेष रूप से, यदि मेर्सन ट्विस्टर इंजन का उपयोग किया जाता है, तो सभी प्रारंभिक राज्यों तक नहीं पहुंचा जा सकता है। Seed_seq का उपयोग करना या तो सहायक नहीं है, क्योंकि यह एक विभाजन नहीं है।मुझे सी ++ 11 std :: default_random_engine को सही तरीके से कैसे बीज करना चाहिए?

यह सब, जहां तक ​​मैं समझता हूं, इसका मतलब है कि std::uniform_int_distribution वास्तव में समान नहीं होगा - क्योंकि सभी बीज मूल्य संभव नहीं हैं।

मैं बस कुछ यादृच्छिक संख्या उत्पन्न करना चाहता हूं। हालांकि यह वास्तव में एक दिलचस्प विषय है जो मैं निश्चित रूप से अपने कुछ खाली समय को समर्पित करूंगा, कई लोगों को यह संभावना नहीं हो सकती है।

तो सवाल यह है कि: मुझे std::default_random_engine को सही तरीके से कैसे बीज करना चाहिए ताकि यह केवल वही करे जो मुझे उम्मीद है?

+1

स्टीफ़न टी Lavavej, माइक्रोसॉफ्ट के एसटीएल प्रत्यारोपण के लीड रखरखाव की सिफारिश है, इस बात में MT19937। वर्चुअल देखने के लायक भी https://channel9.msdn.com/events/GoingNative/2013/rand- माना जाता है- हानिकारक –

+1

@ कुछ प्रोग्रामर dude डिफ़ॉल्ट_ बीज का उपयोग करते हैं यदि आप केवल डिफ़ॉल्ट निर्माण को '5489u' (mt19937 के लिए) के रूप में हार्डकोड किया गया है। एक निश्चित हार्डकोडेड बीज शायद ही कभी आप चाहते हैं। –

+1

मुझे लगता है कि एक 'uniform_int_distribution' अभी भी वर्दी होगी हालांकि आप इसे बीज देते हैं। लेकिन बेहतर बीजिंग समान रूप से वितरित मूल्यों के समान अनुक्रम प्राप्त करने की संभावनाओं को कम कर सकती है। –

उत्तर

5

uniform_int_distribution अभी भी वर्दी होगा हालांकि आप इसे बीज देंगे। लेकिन बेहतर बीजिंग समान रूप से वितरित मूल्यों के समान अनुक्रम प्राप्त करने की संभावनाओं को कम कर सकती है।

मुझे लगता है कि std::seed_seq का उपयोग करके अधिकांश प्रयोजनों के लिए std::random_device से लगभग 8 यादृच्छिक 32 बिट इन्स पर्याप्त होना चाहिए। यह सही नहीं है, पोस्ट में दिए गए कारण के लिए आप लिंक किए गए, लेकिन यदि आप क्रिप्टोग्राफिक प्रयोजनों के लिए वास्तव में सुरक्षित संख्या की जरूरत है आप वास्तव में नहीं वैसे भी एक छद्म यादृच्छिक संख्या जनरेटर का उपयोग करना चाहिए:

constexpr std::size_t SEED_LENGTH = 8; 

std::array<uint_fast32_t, SEED_LENGTH> generateSeedData() { 
    std::array<uint_fast32_t, SEED_LENGTH> random_data; 
    std::random_device random_source; 
    std::generate(random_data.begin(), random_data.end(), std::ref(random_source)); 
    return random_data; 
} 

std::mt19937 createEngine() { 
    auto random_data = generateSeedData(); 
    std::seed_seq seed_seq(random_data.begin(), random_data.end()); 
    return std::mt19937{ seed_seq }; 
} 
+0

क्यों 8 और 6 या 10 नहीं? और अगर मैं पहले नहीं था तो मैं std :: random_device का उपयोग करके सुरक्षित क्यों महसूस कर सकता हूं? – marmistrz

संबंधित मुद्दे