2009-03-16 22 views
5

में निर्धारित रैंडम नंबर स्ट्रीम मैं एक नंबर की आपूर्ति करना चाहता हूं, और फिर यादृच्छिक संख्याओं का एक सेट प्राप्त करना चाहता हूं। हालांकि, मैं चाहता हूं कि वे संख्याएं वही हों, चाहे मैं इसे किस कंप्यूटर पर चलाता हूं (मान लीजिए कि मैं एक ही बीज की आपूर्ति करता हूं)।सी ++ एसटीएल

असल में मेरा प्रश्न है: सी ++ में, यदि मैं rand() का उपयोग करता हूं, लेकिन वर्तमान समय के बजाय उपयोगकर्ता परिभाषित बीज के साथ srand() की आपूर्ति करता हूं, तो क्या मैं किसी भी कंप्यूटर पर एक ही यादृच्छिक संख्या स्ट्रीम उत्पन्न कर पाऊंगा?

उत्तर

5

srand() & rand() एसटीएल का हिस्सा नहीं हैं। वे वास्तव में सी रनटाइम का हिस्सा हैं। हां, वे उसी परिणाम का उत्पादन करेंगे जब तक कि यह srand()/rand() का एक ही कार्यान्वयन है।

आपकी आवश्यकताओं के आधार पर, आप Boost.Random का उपयोग करने पर विचार करना चाहेंगे। यह कई उच्च गुणवत्ता वाले यादृच्छिक संख्या जेनरेटर प्रदान करता है।

+0

को बूस्ट पर +1 कहना होगा। यादृच्छिक। महान काम करता है और उनके पास विशिष्ट निर्धारिक वर्ग भी हैं। – rlbond

4

rand() के कार्यान्वयन को मानते हुए वही हैं, हां।

यह सुनिश्चित करने का सबसे आसान तरीका है कि आपके प्रोग्राम के साथ ज्ञात रैंड() कार्यान्वयन शामिल हो - या तो आपके प्रोजेक्ट के स्रोत कोड में या लाइब्रेरी के रूप में शामिल हो जिसे आप प्रबंधित कर सकते हैं।

+0

"हर" एक बड़ा शब्द है। "हर" के बजाय "सबसे अधिक" के साथ इसे योग्य बनाना आवश्यक है। अधिकांश आधुनिक आरएनजी को 32-बिट हार्डवेयर के अधिकांश परिवारों में लगातार काम करने के लिए डिज़ाइन किया गया है। लेकिन यह 64-बिट मशीनों या दुर्लभ असाधारण हार्डवेयर के बारे में कुछ भी नहीं कहता है। –

+0

यही कारण है कि मैंने कहा कि आपको रैंड() की एक प्रति रखने की आवश्यकता है जिसे आप नियंत्रित कर सकते हैं या कम से कम भविष्यवाणी कर सकते हैं। – greyfade

+0

पर्याप्त मेला :-) यह सुनिश्चित करने के लिए एकमात्र अन्य चीज यह है कि यह आपके सभी लक्षित आर्किटेक्चर के लिए डेटाटाइप के संदर्भ में पोर्टेबल है। –

0

मुझे विश्वास है कि यदि आप उसी बीज के साथ srand के साथ आपूर्ति करते हैं, तो आपको वही परिणाम मिलेंगे। छद्म यादृच्छिक संख्या जनरेटर के मामले में यह बीज की परिभाषा काफी सुंदर है।

7

पुस्तकालयों के रूप में उपलब्ध PRNG के दर्जनों दर्जन हैं। एक चुनें। मैं Mersenne Twister का उपयोग करता हूं।

बाहरी रूप से आपूर्ति की गई लाइब्रेरी का उपयोग करके, आप अपनी भाषा की लाइब्रेरी rand() के अजीब या छोटी गाड़ी के कार्यान्वयन के जोखिम को बाईपास करते हैं। जब तक आपके प्लेटफ़ॉर्म सभी एक ही गणितीय अर्थशास्त्र के अनुरूप होते हैं, तब तक आपको लगातार परिणाम मिलेंगे।

एमटी मेरा पसंदीदा है क्योंकि मैं एक भौतिक विज्ञानी हूं, और मैं मोंटे कार्लो के लिए इन चीजों का उपयोग करता हूं, जहां उच्च आयामों के बराबर वितरण की गारंटी महत्वपूर्ण है। लेकिन एमटी का उपयोग क्रिप्टोग्राफिक पीआरएनजी के रूप में नहीं करते हैं!

+0

जिज्ञासा से, क्यों क्रिप्टो के लिए एमटी का उपयोग नहीं करते? एक लिंक साझा मन? (यह एक ईमानदार सवाल है, मैं snarky होने की कोशिश नहीं कर रहा हूँ :-) –

+0

यह आसानी से पता चलने की छोटी संख्या से भविष्यवाणी की है। विकिपीडिया लेख में एक लिंक है। – dmckee

+1

http://en.wikipedia.org/wiki/Mersenne_twister# आवेदन –

0

हां। किसी दिए गए बीज (प्रारंभ मूल्य) के लिए, संख्याओं का क्रम जो रैंड() रिटर्न हमेशा एक जैसा होगा।

+0

आपको इसे "रैंड() के दिए गए कार्यान्वयन" के साथ अर्हता प्राप्त करनी चाहिए। एक ही अनुक्रम का उत्पादन करने के लिए कोई भी दो पीआरएनजी की गारंटी नहीं है। – greyfade

1

अपना खुद का छद्म यादृच्छिक संख्या दिनचर्या लिखें। इंटरनेट पर दस्तावेज किए गए बहुत सारे एल्गोरिदम हैं, और उनके पास कई एप्लिकेशन हैं जहां रैंड पर्याप्त नहीं है (उदा। Perlin Noise)।

शुरुआत के लिए इन लिंक का प्रयास करें:

http://en.wikipedia.org/wiki/Linear_congruential_generator

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

1

नहीं है, एएनएसआई सी मानक केवल निर्दिष्ट करता है कि rand() 0 और RAND_MAX बीच यादृच्छिक पूर्णांकों की एक धारा का उत्पादन होगा, कम से कम 32767 (source) जो होना चाहिए। यह धारा केवल उसमें निर्धारित निर्धारक होनी चाहिए, किसी दिए गए मशीन पर दिए गए कार्यान्वयन के लिए, उसे उसी बीज को दी गई एक ही पूर्णांक धारा का उत्पादन करना चाहिए।

आप एक पोर्टेबल पीआरएनजी चाहते हैं।Mersenne Twister (नीचे से जुड़े कई कार्यान्वयन) बहुत पोर्टेबल हैं, जैसा कि Ben Pfaff's homegrown C99-compliant PRNG है। Boost.Random भी ठीक होना चाहिए; चूंकि आप सी ++ में अपना कोड लिख रहे हैं, बूस्ट का उपयोग करके प्लेटफार्मों की अपनी पसंद को सीमित नहीं करता है (हालांकि कुछ "कम" (यानी गैर-अनुपालन) कंपाइलर्स को टेम्पलेट मेटाप्रोग्रामिंग के भारी उपयोग के साथ परेशानी हो सकती है)। यह केवल कम मात्रा वाले एम्बेडेड प्लेटफार्मों और शायद उपन्यास अनुसंधान आर्किटेक्चर के लिए एक समस्या है, इसलिए यदि "किसी भी कंप्यूटर" से आपका मतलब है "कोई भी x86/पीपीसी/एआरएम/एसपीएआरसी/अल्फा/आदि मंच जो जीसीसी लक्ष्य" है, तो इनमें से कोई भी उपरोक्त ठीक करना चाहिए।

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