2012-08-13 41 views
18

मैं एक अलग सिस्टम पर एक अलग python3 संस्करण स्थापित के साथ पाइथन के random.random() से एक यादृच्छिक अनुक्रम पुन: पेश करने की कोशिश कर रहा हूं।यादृच्छिक जनरेटर बीजिंग क्यों पाइथन के संस्करणों के बीच स्थिर नहीं है?

यह आसान होना चाहिए के रूप में documentation says:

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

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

    3.2.3 (default, May 3 2012, 15:51:42) 
    [GCC 4.6.3] 
    0.4782479962566343 
    0.044242767098090496 
    0.11703586901195051 
    0.8566892547933538 
    0.2926790185279551 
    0.0067328440779825804 
    0.0013279506360178717 
    0.22167546902173108 
    0.9864945747444945 
    0.5157002525757287 
    
    : दो अलग-अलग मशीनों पर

    import sys 
    print(sys.version) 
    
    from random import seed, random 
    
    seed(str(1)) 
    for i in range(10): 
        print(random()) 
    

    हालांकि, यह परीक्षण:

तो मैं निम्नलिखित कोड हमेशा एक ही 10 नंबर, कोई फर्क नहीं पड़ता विशिष्ट python3 संस्करण मुद्रित करने के लिए उम्मीद

और

3.1.2 (release31-maint, Dec 9 2011, 20:59:40) 
[GCC 4.4.5] 
0.0698436845523 
0.27772471476 
0.833036057868 
0.35569897036 
0.36366158783 
0.722487971761 
0.963133581734 
0.263723867191 
0.451002768569 
0.0998765577881 

विभिन्न परिणाम दें।

यह क्यों है? और वहाँ इस काम करने के लिए बनाने के लिए किसी भी तरह से है

+1

। –

+3

यह बताता है * पिछड़ा संगत बीडर पेश किया जाएगा * यह नहीं कि मौजूदा विधि पिछड़ा संगत होगा। – borrible

उत्तर

15

मैं (इस सवाल की वजह से) What's New in Python 3.2 के माध्यम से देख रहा था, और मैंने पाया (यानी दो बार एक ही यादृच्छिक अनुक्रम मिल सकता है?):

random.seed() फ़ंक्शन और विधि अब एक sha512 हैश फ़ंक्शन के साथ नमक स्ट्रिंग बीजों। पायथन 3.1 अनुक्रमों को पुन: पेश करने के लिए बीज के पिछले संस्करण तक पहुंचने के लिए, संस्करण तर्क को 1, random.seed (s, version = 1) पर सेट करें।

यह पीछे की संगतता विकल्प के साथ एक तोड़ने वाला परिवर्तन (3.1 से 3.2 तक) प्रतीत होता है।

(जैसा कि borrible ने बताया क्योंकि एक संगत बोने की मशीन प्रलेखन अनुबंध का उल्लंघन नहीं किया गया है की पेशकश की है।)

+0

धन्यवाद, यह समस्या होनी चाहिए। मुझे कहना होगा कि यह बहुत सुविधाजनक नहीं है कि संस्करण तर्क अभी तक 3.1 में मौजूद नहीं है :( –

+1

जब आप स्ट्रिंग बीजों का उपयोग करते हैं तो यह लागू होता है। ओपी के विपरीत, मैं अपने यादृच्छिक संख्या जेनरेटर को स्याही के साथ बीजिंग कर रहा हूं, और विभिन्न परिणामों को देख रहा हूं। संयोग से, गेटस्टेट() विधि एक ही आंतरिक स्थिति लौटाती है, इसलिए यह बीजिंग बिट नहीं बदला गया है, यह वास्तविक यादृच्छिक न्यूमर पीढ़ी है। –

+3

ओह, वास्तव में मुझे यादृच्छिक दिखाई देता है। यादृच्छिक() एक ही अनुक्रम उत्पन्न करता है - यह यादृच्छिक है। शफल () और random.randrange() जो पाइथन 3.1 और 3.2 पर विभिन्न परिणामों का उत्पादन करते हैं, भले ही एक ही बीज दिया गया हो .-( –

4

seed के लिये दस्तावेज कहते हैं कि वे मान्य इनपुट बीज के लिए तार कन्वर्ट करने के लिए हैश समारोह का उपयोग करें। जब मैंने Python2.X के विभिन्न संस्करणों का परीक्षण किया (इस समय 3 स्थापित नहीं किया गया है), कुछ संस्करणों ने hash(str(1)) के लिए अलग-अलग मान दिए हैं ध्यान दें कि बीज के लिए दस्तावेज़ कहते हैं कि, संस्करण के बावजूद, वे स्ट्रिंग के लिए hash मान का उपयोग करते हैं। आप इसके बजाय एक int पास करना चाहेंगे (बीज के पीछे-संगत संस्करण का उपयोग करने के बारे में @pst के बिंदु के अतिरिक्त)।

स्निपेट random module docs से 3 के लिए स्निपेट।2:

यदि एक्स एक int है, तो इसका उपयोग सीधे किया जाता है।

संस्करण 2 (डिफ़ॉल्ट) के साथ, एक स्ट्र, बाइट्स, या बाइटियर्रे ऑब्जेक्ट एक int में परिवर्तित हो जाता है और इसके सभी बिट्स का उपयोग किया जाता है। संस्करण 1 के साथ, हैश() x का उपयोग इसके बजाय किया जाता है।

(यहां x बीज के लिए प्रारंभकर्ता है) क्या यह लायक है, दो तुम्हें तैनात दोनों में से किसी की तुलना में संख्या का एक पूरी तरह से अलग सेट 2.7 में अपने कोड स्निपेट चल उत्पादन के लिए