2016-11-01 6 views
30

के साथ विभिन्न ओएस पर एक ही यादृच्छिक संख्या अनुक्रम प्राप्त करें क्या एक ही बीज के साथ विभिन्न ऑपरेटिंग सिस्टम में एक ही यादृच्छिक int संख्या अनुक्रम प्राप्त करने का कोई तरीका है? मैं इस कोड की कोशिश की है:एक ही बीज

std::default_random_engine engine(seed); 
std::uniform_int_distribution<int> dist(0, N-1); 

अगर मैं एक ही बीज, जिले (इंजन) के अनुक्रम के साथ एक मशीन पर कई बार इस कोड को दौड़ा ही है, लेकिन अलग ऑपरेटिंग सिस्टम क्रम पर अलग है।

+6

क्योंकि प्रत्येक सिस्टम पर 'std :: default_random_engine' एक ही पीएनआरजी नहीं होना चाहिए,' std :: mt19937' का उपयोग करें। –

+2

मेरा मानना ​​है कि एक विशेष यादृच्छिक इंजन जैसे 'std :: mt19937' को एक विशेष बीज के लिए समान संख्या देने की आवश्यकता है, लेकिन मुझे नहीं लगता कि वितरण है। तो आपको अपना खुद का वितरण लिखना पड़ सकता है। –

उत्तर

37

हां वहाँ है, लेकिन आपको प्रत्येक प्लेटफ़ॉर्म पर एक ही पीआरएनजी को बिल्कुल अलग करने या इसे ठीक करने की आवश्यकता है। std::default_random_engine engine एक कार्यान्वयन परिभाषित पीआरएनजी है। इसका मतलब है कि आपको हर मंच पर एक ही पीआरएनजी नहीं मिल सकता है। यदि आपके पास वही नहीं है तो वही अनुक्रम प्राप्त करने की संभावना बहुत कम है।

आपको जो चाहिए वह std::mt19937 जैसा है जो एक ही बीज के लिए एक ही आउटपुट देने के लिए आवश्यक है। वास्तव में <random> में std::default_random_engine engine के अलावा सभी परिभाषित जेनरेटर उसी बीज का उपयोग करते समय एक ही आउटपुट का उत्पादन करेंगे।

दूसरी बात जो आपको जाननी है वह यह है कि std::uniform_int_distribution भी कार्यान्वयन परिभाषित किया गया है। इसका उपयोग करने वाले सूत्र को परिभाषित किया गया है लेकिन जिस तरह से यह प्राप्त होता है वह कार्यान्वयनकर्ता को छोड़ दिया जाता है। इसका मतलब है कि आपको सटीक आउटपुट नहीं मिल सकता है। यदि आपको पोर्टेबिलिटी की आवश्यकता है तो आपको अपने वितरण को रोल करने या तीसरे पक्ष को प्राप्त करने की आवश्यकता होगी जो प्लेटफ़ॉर्म पर ध्यान दिए बिना हमेशा समान रहेगा।

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