1 मूल्य से एन स्वतंत्र यादृच्छिक संख्या जनरेटर बीज के लिए सबसे अच्छा तरीका है


10

मेरे कार्यक्रम में मुझे अपने स्वयं के आरएनजी के साथ प्रत्येक एन-थ्रेड को अलग-अलग चलाने की आवश्यकता है जो कि एक बड़े डेटासेट के नमूने के लिए उपयोग किया जाता है। मुझे इस पूरी प्रक्रिया को एक मान के साथ बीजने में सक्षम होने की आवश्यकता है ताकि मैं परिणामों को पुन: पेश कर सकूं।

क्या यह केवल अनुक्रमिक रूप से प्रत्येक सूचकांक के लिए बीज बढ़ाने के लिए पर्याप्त है?

वर्तमान में मैं का उपयोग numpyकी RandomStateजो एक Mersenne ट्विस्टर छद्म यादृच्छिक संख्या जनरेटर का उपयोग करता है।

नीचे दिए गए कोड का स्निपेट:

# If a random number generator seed exists
if self.random_generator_seed:
    # Create a new random number generator for this instance based on its
    # own index
    self.random_generator_seed += instance_index
    self.random_number_generator = RandomState(self.random_generator_seed)

अनिवार्य रूप से मैं एक उपयोगकर्ता-इनपुट बीज (यदि यह मौजूद है) के साथ शुरू होता है और प्रत्येक उदाहरण / धागे के लिए मैं क्रमिक रूप से चल रहे उदाहरण के सूचकांक (0 से एन -1) को जोड़ता हूं। मुझे नहीं पता कि यह अच्छा अभ्यास है या यदि ऐसा करने का एक बेहतर तरीका है।


1
क्या आप पहले से जानते हैं कि प्रत्येक धागा कितने छद्म यादृच्छिक मूल्यों का उपयोग करेगा - या कम से कम आप एक अच्छा ऊपरी बाध्य अनुमान प्राप्त कर सकते हैं?
whuber

नहीं, मैं नहीं कर सकता। यह उन क्षेत्रों के नमूने लेता है जो एक सीमा तक अभिव्यक्त होते हैं। क्षेत्रों के आकार में काफी भिन्नता हो सकती है।
एरिक आरएपी

जवाबों:


9

यह निश्चित रूप से महान अभ्यास नहीं है। उदाहरण के लिए, विचार करें कि जब आप 12345 और 12346 के मूल बीजों के साथ दो रन बनाते हैं तो क्या होगा। प्रत्येक रन में N-1धाराएँ समान होंगी ।

Mersenne ट्विस्टर कार्यान्वयन (सहित numpy.randomऔर random) आमतौर पर बड़े राज्य वेक्टर (624 32-बिट पूर्णांक) में एमटी का उपयोग करने वाले पूर्णांक बीज का विस्तार करने के लिए एक अलग PRNG का उपयोग करते हैं; इस से सरणी है RandomState.get_state()। आप जो चाहते हैं उसे करने का एक अच्छा तरीका है कि PRNG, आपके इनपुट पूर्णांक के साथ एक बार चला जाए, और इसमें से N*62432-बिट पूर्णांक प्राप्त करें। विभाजित करें कि Nराज्य वैक्टर में प्रवाहित करें और RandomState.set_state()प्रत्येक RandomStateउदाहरण को स्पष्ट रूप से आरंभ करने के लिए उपयोग करें । PRNG (वे समान हैं) प्राप्त करने के लिए आपको numpy.randomया _randomमानक पुस्तकालय के सी स्रोतों से परामर्श करना पड़ सकता है । मुझे यकीन नहीं है कि अगर किसी ने पायथन के लिए उस PRNG के स्टैंडअलोन संस्करण को लागू किया है।


मुझे लगता है कि यह अब तक का सबसे अच्छा समाधान हो सकता है। मुझे नहीं लगता कि यह बहुत मायने रखता है कि मैं स्ट्रीम को कैसे विभाजित करता हूं हालांकि सही है? ऐसा लगता है कि उदाहरणों के बीच 624 32-बिट पूर्णांक पर एक डुप्लिकेट अनुक्रम होने की संभावना नहीं है, भले ही वे प्रारंभिक PRNG और बीज से उठाए गए हों।
एरिक आरएपी

1
दरअसल, मैं इसे थोड़ा पीछे चला जाऊंगा। यह मेरे लिए स्पष्ट नहीं है कि शुरुआती PRNG को मनमाने ढंग से तैयार किया गया है ताकि इसमें से कई मान निकाले जा सकें। राज्य धारा उत्पन्न करने के लिए एक अन्य गुणवत्ता PRNG (अधिमानतः MT से असंबंधित) का उपयोग करने पर विचार करें। एक HMAC-DRBG (एक PRNG एक क्रिप्टोग्राफिक आदिम के रूप में एक HMAC का उपयोग करके) को लागू कर सकता है केवल मानक पुस्तकालय अपेक्षाकृत सरल रूप से उपयोग कर रहा है। क्रिप्टोग्राफिक सुरक्षा एक चिंता का विषय नहीं है; बिटस्ट्रीम के कार्यान्वयन और गुणवत्ता में आसानी। आपको यह सुनिश्चित करने की आवश्यकता होगी कि कोई भी शून्य-वैक्टर नहीं बनाया जाए, बहुत दुर्लभ ऑफ-चांस पर।
रॉबर्ट कर्ने

या बस RandomStateविकास में नए कार्यान्वयन में से एक का उपयोग करें जो एक एल्गोरिथ्म का उपयोग करता है जिसमें बसने योग्य धाराएं होती हैं। यही है, आप प्रत्येक RandomStateउदाहरण को एक ही बीज और अलग-अलग स्ट्रीम आईडी (केवल वेतन वृद्धि ठीक है) के साथ आरंभ करते हैं , और आपको स्वतंत्र स्ट्रीम की गारंटी दी जाती है। pypi.python.org/pypi/randomstate
रॉबर्ट कर्न

4

एक समाधान जो समानांतर प्रसंस्करण में उपयोग किया जाता है वह है आपके यादृच्छिक जनरेटर , जहां आपका बीज है, का उपयोग बैच द्वारा किया जाता है:Φ(यू)यूएन

  1. उत्पन्न करेंΦ(यू),Φएन(यू),Φ2*एन(यू),
  2. उत्पन्न करेंΦ2(यू),Φ1+एन(यू),Φ1+2*एन(यू),
  3. ...
  4. उत्पन्नΦएन-1(यू),Φएन-1+एन(यू),Φएन-1+2*एन(यू),

जहाँ । इस तरह आप एकल बीज का उपयोग करते हैं और आपके क्रम सभी समान और स्वतंत्र होते हैं।Φn(यू)=Φ(Φn-1(यू))


2

अब रैंडम गेन नामक एक पायथन पैकेज है जिसे प्राप्त करने के तरीके हैं।

यह एक एकल बीज से बनाई गई स्वतंत्र धाराओं का समर्थन करता है , साथ ही पुराने यादृच्छिक संख्या जनरेटर जैसे MT19937 के लिए एक जंपिंग प्रोटोकॉल।


0

कुछ लोग दावा करते हैं कि क्रमिक बीजों द्वारा उत्पन्न यादृच्छिक संख्या में सहसंबंध हैं। /programming/10900852/near-seeds-in-random-number-generation-may-give-similar-random-numbers मुझे यकीन नहीं है कि यह कितना सच है।

यदि आप इसके बारे में चिंतित हैं, तो अन्य सभी जनरेटर के लिए बीज चुनने के लिए एक भी यादृच्छिक संख्या जनरेटर का उपयोग क्यों नहीं करें?


केवल इसलिए कि मैं 1 से अधिक जनरेटर के लिए एक ही बीज को बेतरतीब ढंग से उत्पन्न करने का कोई मौका नहीं देना चाहता। बेशक, मैं इसे रोकने के लिए कुछ प्रोग्रामिंग कार्य कर सकता था, लेकिन फिर मुझे नहीं पता कि पहली जगह में बीज को क्रमिक रूप से चुनने से बेहतर कैसे होगा।
एरिक आरएपी

1
जाहिरा तौर पर , अनुक्रमिक बीजों के साथ सहसंबंध संभव हैं ... हालांकि, जैसा कि जॉन डी कुक के ब्लॉग से उस उत्तर में जुड़ा हुआ लेख दिखाता है, अन्य जनरेटर के लिए बीज उत्पन्न करने के लिए एक आरएनजी का उपयोग करना कहीं अधिक बदतर है, क्योंकि आप जन्मदिन की समस्या में भाग लेते हैं! यह कहता है कि 1000 16-बिट अहस्ताक्षरित बीज उत्पन्न करने से 99.95% ओवरलैप होने की संभावना है!
प्रवीण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.