C ++ पर रैंडम नंबर


12

हाल ही में मुझे आधुनिक भाषाओं की आदत हो गई है जिसमें एक स्टॉक अच्छा यादृच्छिक जनरेटर शामिल है, जो आमतौर पर मर्सिएन ट्विस्टर है; अब जब मैं C ++ पर वापस आ गया तो मुझे यह तय करना होगा कि क्या उपयोग करना है।

मैंने मेरसेन ट्विस्टर कार्यान्वयन के लिए खोज की और मैंने देखा कि वहाँ बहुत सारे हैं: क्या कोई ऐसा है जो अधिक उपयोग किया जाता है और व्यापक है, या क्या मैं यह मानने वाला हूं कि वे सभी समान रूप से अच्छे हैं?


1
मुझे C ++ और आधुनिक भाषाओं का आपका अलगाव पसंद है।
जकोरा

2
शायद "उच्च स्तर" कहना अधिक उचित था।
ओ ० '।

मुझे लगता है कि यह प्रश्न
स्टैकओवरफ़्लो

5
SO पर मैं एक अलग उत्तर दूंगा क्योंकि मुझे नहीं पता था कि यह एक गेम इंजन के लिए था, जैसा कि कहा जाता है, चिकित्सा उपचारों के लिए मोंटे कार्लो सिमुलेशन, जिसमें 624 आयाम यादृच्छिकता के घातक नहीं हो सकते हैं।

जवाबों:


19

C ++ 11 में अपने नए <random>इंटरफ़ेस के भाग के रूप में डिफ़ॉल्ट रूप से मेरसेन ट्विस्टर जनरेटर शामिल है । उदाहरण के लिए, MT का उपयोग करके [-10, 10] के बीच समान रूप से पूर्णांक उत्पन्न करना:

std::mt19937 eng; // This is the Mersenne Twister
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
    std::cout << dist(eng) << std::endl;

यह भी टीआर 1 की पेशकश करने वाले किसी भी संकलक में उपलब्ध है, हालांकि नाम थोड़े अलग हैं; std::tr1::mt19937और std::tr1::uniform_int<int>

मैं आमतौर पर लोगों को Mersenne Twister के इस्तेमाल से दूर करता हूं। यह एक ठीक एल्गोरिथ्म है, लेकिन इसकी लोकप्रियता का एक बहुत ही विपणन है। यादृच्छिकता के 624 आयाम अधिकांश लोगों की आवश्यकता से अधिक है, और एमटी अपेक्षाकृत भारी राज्य की आवश्यकताओं को पूरा करता है और जब यह एक पूर्ण तालिका पुनर्गणना करता है तो यह कैश को उड़ा सकता है। मैं व्यक्तिगत रूप से xorshift का आंशिक हिस्सा हूं जो कि छोटी गेम और सीपीयू आवश्यकताओं के साथ खेल की ज़रूरतों के लिए उत्कृष्ट अवधि और उचित वितरण देता है।

मैंने एक (अधिकतर?) C ++ 11-संगत xorshift जनरेटर - xorshift.hpp , xorshift.cpp - लिखा है और इसे सार्वजनिक डोमेन में रखा है। आप इसे किसी भी C ++ 11 रेंडमाइजेशन फंक्शन में प्लग कर सकते हैं, जैसा कि ऊपर दिया गया है:

xorshift eng;
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
    std::cout << dist(eng) << std::endl;

5
हाँ, यह उसी तरह का उत्तर है जिसकी मुझे तलाश थी, इसीलिए मैंने यहाँ gamedev पर पोस्ट किया है:)
'।

1
बस यह नोट करना चाहता था कि आपके द्वारा लिंक की गई फ़ाइलों में से कुछ भी नहीं दर्शाता है कि वे सार्वजनिक डोमेन में हैं। जिस तरह से कॉपीराइट कानून काम करता है, वास्तव में उस बारे में स्पष्ट रूप से ध्यान देने की आवश्यकता है, क्योंकि कानून डिफ़ॉल्ट रूप से "सभी अधिकार आरक्षित" मानता है। यह वास्तव में एमआईटी या बीएसडी 2-खंड लाइसेंस जैसे कुछ का उपयोग करने के लिए भी सुरक्षित है, क्योंकि कुछ क्षेत्राधिकार मूल रूप से "यह सार्वजनिक डोमेन में" कानूनी रूप से बाध्यकारी के रूप में स्वीकार नहीं करते हैं। यदि आप लोगों को अपने कोड का उपयोग देखने में रुचि रखते हैं, तो यह ध्यान रखने योग्य है।
शॉन मिडिलडाइच

1
@seanmiddleditch: मैं इसके बारे में यहीं स्पष्ट कर रहा हूं। यदि आप इसे एमआईटी-शैली लाइसेंस के तहत चाहते हैं, तो मैं SQLite के नेतृत्व का पालन करूंगा और आपको केवल $ 1000 के लिए दे दूंगा।

कुछ भी घोषित कोड में एक हैडर की कमी (जो SQLite करता है, iirc) मुख्य समस्या है। यदि आप परवाह नहीं करते हैं, तो यह अच्छा है। सिर्फ आपको एक अनुकूल सुझाव दे रहा था।
सीन मिडिलिचच

1

एक अन्य RNG जिसे मैंने gamedev प्रयोजनों के लिए उपयोग किया है बॉब जेनकिन्स का "छोटा" RNG है, जिसका वर्णन यहाँ किया गया है

(उनके पास एक क्रिप्टोग्राफ़िक-शक्ति RNG है जिसे ISAAC कहा जाता है, लेकिन यह बड़ा और धीमा है, और खेलों को ताकत के स्तर की आवश्यकता नहीं है।)


1
जो कि xorshift (4 xors और 3 shifts बनाम 4 जोड़, 6 पारियों, 2 ors, और xor) की तुलना में अधिक महंगा लगता है, की अवधि खराब होती है, और कुछ इनिशियलाइज़ेशन के साथ बहुत कम चक्रों के जोखिम को चलाता है। यह तेज़ दिखता है लेकिन सबसे तेज़ नहीं; ठीक अवधि लेकिन इष्टतम के पास कहीं नहीं; एक ही बुनियादी वितरण गुण xorshift के रूप में; मुझे इसका उपयोग करने का कोई कारण नहीं दिख रहा है।

काफी उचित। मैं वितरण और चक्र गुणों में खुदाई करने के लिए RNG विश्लेषण के बारे में पर्याप्त नहीं जानता।
नाथन रीड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.