अजगर में यादृच्छिक बीज निर्धारित करें


83

मेरे पास एक बड़ा कार्यक्रम है, जहां मैं randomविभिन्न फाइलों में मॉड्यूल से कार्यों का उपयोग करता हूं । मैं एक बार, एक स्थान पर, एक ही स्थान पर, हमेशा एक ही परिणाम देने के लिए यादृच्छिक बीज सेट करने में सक्षम होना चाहूंगा। क्या उसमें भी कुछ हासिल किया जा सकता है python?

जवाबों:


121

मुख्य अजगर मॉड्यूल जो चलाया जाता है import randomऔर कॉल करना चाहिए random.seed(n)- यह अन्य सभी आयातों के बीच साझा किया जाता है randomजब तक कि कहीं और बीज को रीसेट नहीं करता है।


3
क्या मैं इसे बिना जाने ही कहीं रीसेट कर सकता हूं? बीज को मुख्य फाइल में एक बार सेट करने के कारण, ट्रिक नहीं करता है
मिशा ओब्रेच

1
@MischaObrecht मुझे लगता है कि - बीज केवल यादृच्छिक मॉड्यूल के पहले आयात पर आरोपित है - यदि यह एक से अधिक बार आयात किया जाता है, तो यह प्रारंभिक प्रदर्शन नहीं करेगा और बीज को रीसेट करेगा - इसलिए आपके कोड में कहीं एक स्पष्ट कॉल होना चाहिए
जॉन क्लेमेंट्स

3
यदि आप randomमॉड्यूल स्तर कोड से विधियों को कॉल कर रहे हैं , जो कि आप मुख्य में आयात कर रहे हैं, इससे पहले कि आप मुख्य में मिलते हैं random.seed(n), तो उन कॉलों को बीज से पहले किया जाएगा, और इसलिए समय-बीज और प्रभावी रूप से अन-प्रजनन योग्य हो जाएगा यादृच्छिक।
रसेल बोरोगोव

13
यदि यह पता चलता है कि कुछ तृतीय-पक्ष कोड RNG (अप्रभावित लेकिन संभव) का पुनर्निधारण कर रहा है, तो ध्यान दें कि आप random.Random()निर्माणकर्ता के माध्यम से स्वतंत्र राज्य के साथ अतिरिक्त यादृच्छिक संख्या जनरेटर बना सकते हैं , और जब सख्त प्रतिलिपि प्रस्तुत करना महत्वपूर्ण हो तो उनका उपयोग करें।
रसेल बोरोगोव

यह मेरे लिए काम नहीं करता है। और मेरे पास कोई प्रतिलिपि योग्य कोड नहीं है। मैं अनुमान लगा रहा हूं कि मुझे सभी आयातित पुस्तकालयों के प्रलेखन की जांच करनी होगी ... (देखें stackoverflow.com/questions/37886997/…
B फर्टाडो

36

zss की टिप्पणी को वास्तविक उत्तर के रूप में रेखांकित किया जाना चाहिए:

लोगों से सावधान रहने की एक और बात: यदि आप उपयोग कर रहे हैं numpy.random, तो आपको numpy.random.seed()बीज को सेट करने के लिए उपयोग करने की आवश्यकता है । उपयोग random.seed()करने से उत्पन्न यादृच्छिक संख्याओं के लिए बीज निर्धारित नहीं होगा numpy.random। इससे मुझे थोड़ी देर के लिए उलझन हुई। -zss


बिल्कुल सच है, अगर आपके आवेदन में कहीं आप यादृच्छिक संख्याओं का उपयोग कर रहे हैं random module, random.choices()तो फ़ंक्शन को कहने देता है और फिर कुछ अन्य बिंदुओं पर numpyयादृच्छिक संख्या जनरेटर को नीचे की ओर ले जाता है , जो कहता है कि np.random.normal()आपको दोनों मॉड्यूल के लिए बीज सेट करना होगा। आम तौर पर मैं जो कुछ भी करना चाहता हूं main.py, वह है मेरी तरह random.seed(my_seed)और लाइनों में np.random.seed(my_seed)। कुडोस zss लिए
Aenaon

ऋषि के पास एक समान मुद्दा है, क्योंकि इसका PRNG अजगर और सुन्न दोनों से अलग है। set_random_seed()साधु के लिए उपयोग करें ।
ब्रेंट बेकाला

8

आपके एप्लिकेशन की शुरुआत में random.seed(x)सुनिश्चित करें कि x हमेशा एक ही है। यह सुनिश्चित करेगा कि छद्म यादृच्छिक संख्याओं का क्रम अनुप्रयोग के प्रत्येक रन के दौरान समान होगा।


3

जॉन क्लेमेंट्स बहुत ज्यादा मेरे सवाल का जवाब देता है। हालांकि यह असली समस्या नहीं थी: यह पता चला है, कि मेरे कोड की यादृच्छिकता का कारण सुन्न था। एसवीडीएलजीजी एसवीडी क्योंकि यह हमेशा बुरी तरह से वातानुकूलित मैट्रिस के लिए समान परिणाम नहीं देता है !!

तो अपने कोड में उस के लिए जाँच करने के लिए सुनिश्चित करें, अगर आप एक ही समस्या है!


23
लोगों को सावधान रहने के लिए एक और बात: यदि आप numpy.random का उपयोग कर रहे हैं, तो आपको बीज को सेट करने के लिए numpy.random.seed () का उपयोग करने की आवश्यकता है। Random.seed () का उपयोग करना numpy.random से उत्पन्न यादृच्छिक संख्याओं के लिए बीज को सेट नहीं करेगा। इससे मुझे थोड़ी देर के लिए उलझन हुई।
zss

1

पिछले उत्तरों पर निर्माण: इस बात से अवगत रहें कि कई निर्माण निष्पादन पथों को नष्ट कर सकते हैं, तब भी जब सभी बीज नियंत्रित होते हैं।

मैं सोच रहा था " अच्छी तरह से मैंने अपने बीज निर्धारित किए हैं ताकि वे हमेशा समान रहें, और मेरी कोई बदलती / बाहरी निर्भरता नहीं है, इसलिए मेरे कोड का निष्पादन पथ हमेशा समान होना चाहिए ", लेकिन यह गलत है।

उदाहरण है कि बिट मुझे था list(set(...)), जहां परिणामी आदेश भिन्न हो सकते हैं।


अच्छी बात है, इसने मुझे पहले जला दिया। इसके अलावा चीजें जैसे एक DB से परिणाम प्राप्त करना, वे क्रम से बाहर (बेतरतीब ढंग से) के रूप में अच्छी तरह से जब तक आप अन्यथा निर्दिष्ट नहीं करते हैं
जस्टिन फर्नेस

0

एक महत्वपूर्ण चेतावनी यह है कि 3.7 से पहले अजगर संस्करणों के लिए, शब्दकोश कुंजी निर्धारक नहीं हैं। यह कार्यक्रम में यादृच्छिकता या यहां तक ​​कि एक अलग क्रम में उत्पन्न हो सकता है जिसमें यादृच्छिक संख्याएं उत्पन्न होती हैं और इसलिए गैर-निर्धारक यादृच्छिक संख्याएं होती हैं। निष्कर्ष अद्यतन अजगर।


-14

आप अपने खुद के यादृच्छिक संख्या जनरेटर का उपयोग करके इस आसानी से गारंटी दे सकते हैं।

बस तीन लार्ज प्राइम चुनें (यह एक क्रिप्टोग्राफी एप्लिकेशन नहीं है), और उन्हें एक, बी और सी में प्लग करें: a = ((a * b)% c) यह एक प्रतिक्रिया प्रणाली देता है जो बहुत यादृच्छिक डेटा पैदा करता है। ध्यान दें कि सभी प्राइम्स समान रूप से अच्छी तरह से काम नहीं करते हैं, लेकिन यदि आप केवल एक सिमुलेशन कर रहे हैं, तो यह कोई फर्क नहीं पड़ता - आपको वास्तव में सबसे अधिक सिमुलेशन की आवश्यकता है एक पैटर्न के साथ संख्याओं का एक गड़गड़ाहट (छद्म-यादृच्छिक, याद रखें) पर्याप्त जटिल है यह आपके आवेदन के साथ किसी तरह से मेल नहीं खाता है।

नुथ इस बारे में बात करता है।


10
अपना खुद का रोल करना अनावश्यक है, क्योंकि पायथन में अपने मानक पुस्तकालय में उत्कृष्ट यादृच्छिक संख्या सुविधाएं हैं, और यदि आप क्या कर रहे हैं, यह नहीं जानते तो वास्तव में एक बुरा जनरेटर बनाना बहुत आसान है।
रसेल बोरोगोव

6
मैं मानता हूं कि यह एक बहुत बुरा समाधान है: मोंटे कार्लो सिमुलेशन (जो कि मेरा कार्यक्रम है) में, जहां कोई आमतौर पर लाखों नमूने एकत्र करता है, सहसंबद्ध यादृच्छिक संख्या (खराब जनरेटर से उपजी) आसानी से आपके परिणामों को गड़बड़ कर सकती है !!
मिशा ओब्रेचट

आपका मतलब है, नुथ हर समय इस बारे में बात कर रहा है? अब भी?
अर्थ-टू-अर्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.