मैं अपने कार्यक्रम में सी ++ रैंड() फ़ंक्शन के आधार पर कुछ हज़ार ऑब्जेक्ट उत्पन्न करता हूं। उन्हें स्मृति में रखते हुए संपूर्ण होगा। क्या किसी भी समय रैंड() के वर्तमान बीज की प्रतिलिपि बनाने का कोई तरीका है? यह मुझे केवल मौजूदा बीजों को स्टोर करने का अवसर प्रदान करेगा, न कि पूर्ण वस्तुओं को। (इस प्रकार मैं उन वस्तुओं पुनर्जीवित कर सकता, यादृच्छिक संख्या का ठीक उसी उप दृश्यों पुनः द्वारा)सी ++ रैंड() से वर्तमान बीज कैसे प्राप्त करें?
एक संपूर्ण समाधान) रैंड (द्वारा दिए गए पूर्ण यादृच्छिक संख्या के अनुक्रम भंडारण है - इसके लायक नहीं है। एक और समाधान यादृच्छिक संख्याओं के लिए अपनी कक्षा को लागू करना है।
Google ने मुझे कोई सकारात्मक संकेत नहीं दिया। रैंड और एसआरएंड की मूल बातें सिखाते हुए सैकड़ों लेख हैं, और मुझे विशिष्ट नहीं मिल सका।
क्या कोई भी लागू बीज-स्टीयरर के साथ अन्य यादृच्छिक संख्या जेनरेटर जानता है?
आपके तेज उत्तरों के लिए धन्यवाद! इस प्रश्न के लिए अधिक संभावित उत्तर/समाधान हैं, इसलिए मैंने यहां आपके उत्तरों की एक सूची बनाई है।
समाधान:
संक्षिप्त उत्तर है: बीज
निकटतम संभावित समाधान, शुरुआत में प्रारंभिक बीज बचाने के लिए, और गिनती कितने है पाने के लिए कोई मानक तरीका है बार आप रैंड() फ़ंक्शन को कॉल करते हैं। मैंने इसे समाधान के रूप में चिह्नित किया क्योंकि यह वर्तमान std :: rand()प्रत्येक कंपाइलर (और यह मुख्य प्रश्न था) पर कार्य करता है। मैंने अपने 2.0 गीगाहर्ट्ज सीपीयू को बेंचमार्क किया है, और पाया कि मैं & रैंड() 35 सेकंड में 1,000,000,000 बार गिन सकता हूं। यह अच्छा लग सकता है, लेकिन मेरे पास एक ऑब्जेक्ट उत्पन्न करने के लिए 80,000 कॉल हैं। यह पीढ़ियों की संख्या 50,000 तक सीमित करता है क्योंकि हस्ताक्षर किए गए लंबे आकार का आकार।
class rand2 { unsigned long n; public: rand2() : n(0) {} unsigned long rnd() { n++; return rand(); } // get number of rand() calls inside this object unsigned long getno() { return n; } // fast forward to a saved position called rec void fast_forward (unsigned long rec) { while (n < rec) rnd(); } };
एक और तरीका है, अपने खुद के छद्म यादृच्छिक संख्या जनरेटर लागू करने के लिए है की तरह एक Matteo इटली का सुझाव दिया: वैसे भी, यहाँ मेरी कोड है। यह सबसे तेज़, और संभवतः सबसे अच्छा समाधान है। आप 4,294,967,295 रैंड() कॉल तक सीमित नहीं हैं, और अन्य पुस्तकालयों का उपयोग करने की आवश्यकता नहीं है। यह उल्लेखनीय है कि विभिन्न कंपाइलरों के पास अलग जनरेटर हैं। मैंने मैट्वे के एलसीजी की तुलना रैंड() मिंगव/जीसीसी 3.4.2 और जी ++ 4.3.2 में की है। उनमें से सभी अलग थे (बीज = 0 के साथ)।
सी ++ 11 या अन्य पुस्तकालयों से जनरेटर का उपयोग करें कबी, जेरी कॉफिन और माइक सेमुर ने सुझाव दिया। यह सबसे अच्छा विचार है, अगर आप पहले से ही उनके साथ काम कर रहे हैं। सी ++ 11 जनरेटर के लिए लिंक: http://en.cppreference.com/w/cpp/numeric/random
यदि समाधान 2 में केवल गिनती सीमा समस्या है तो आप ओवरफ्लो को गिनने के लिए एक और 'हस्ताक्षरित लंबा' काउंटर जोड़ सकते हैं। यह प्रभावी रूप से आपके काउंटर के बिट आकार को दोगुना कर देगा और, ज़ाहिर है, आगे बढ़ाया जा सकता है। – bjhend
बीटीडब्लू, समाधान समाधान जोड़ने के लिए यह अच्छा है (अच्छी पुरानी यूजनेट परंपरा?)। – bjhend
हे, नहीं। मुझे वास्तव में गूगल का उपयोग करना था जिसका अर्थ है :)। बस सोचा कि कुछ प्रतिक्रिया देना अच्छा होगा, कि उत्तर उपयोगी थे। – user1339629