2012-01-26 30 views
12

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

मैं कुछ कोड है जो इसे पर चलने प्रदर्शन परीक्षणों होगा, यादृच्छिक डेटा के आधार पर लिखना चाहते हैं। मैं चाहता हूं कि प्रत्येक मशीन पर प्रत्येक टेस्ट रन के लिए यह डेटा समान हो, लेकिन मैं भंडारण कारणों के लिए यादृच्छिक डेटा को परीक्षण के साथ नहीं भेजना चाहता (यह कई मेगाबाइट्स हो सकता है)।

random मॉड्यूल के लिए पुस्तकालय कहना है कि एक ही बीज हमेशा किसी भी मशीन पर उसी क्रम दे देंगे प्रकट नहीं होता है।

संपादित करें: यदि आप मैं डेटा बीज (जैसा कि मैंने ऊपर कहा) सुझाव देने के लिए जा रहे हैं, प्रलेखन कि दृष्टिकोण वैध कहते हैं प्रदान करें, और मशीनों/कार्यान्वयन की एक श्रृंखला पर काम करेंगे।

संपादित करें: मैक ओएस एक्स और सीपीथन 2.7.1 और सीपीथन 2.52 = .2 पर सीपीथन 2.7.1 और पीपीपी 1.7। उबंटू एक ही परिणाम देने लगते हैं। फिर भी, कोई दस्तावेज़ जो इसे काले और सफेद में निर्धारित नहीं करता है।

कोई भी विचार?

+2

क्या आपने * किसी दिए गए बीज के साथ अनुक्रम उत्पन्न करने की कोशिश की है? – bdares

+0

मेरे पास केवल एक कंप्यूटर और एक ऑपरेटिंग सिस्टम है, इसलिए मैं विश्वसनीय रूप से इसका परीक्षण नहीं कर सकता। – Joe

+0

जैसा कि मुझे लगता है कि मूल रूप से सवाल "क्या है?" अगर सिफर - यह बहुत बुरा विचार है और इसे मत करो। आपको "क्या के लिए" लिखना होगा। – theWalker

उत्तर

4

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

प्रलेखन के अनुसार, अजगर कोर जनरेटर के रूप में Mersenne Twister उपयोग करता है। एक बार इस एल्गोरिथ्म वरीयता प्राप्त है यह किसी भी बाहरी उत्पादन जो आगामी कॉल बदल जाएगा प्राप्त नहीं होता है, तो यह एक ही बीज देने के लिए और आप एक ही परिणाम मिलेंगे।

बेशक आप भी एक बीज की स्थापना और यादृच्छिक संख्या की बड़ी सूचियों पैदा करने और सत्यापित करें कि वे एक ही कर रहे हैं के द्वारा इस का निरीक्षण कर सकते हैं, लेकिन मुझे लगता है कि अकेले विश्वास करने के लिए इच्छुक नहीं समझ।

मैं जांच न की हो CPython लेकिन मैं के अलावा अन्य अजगर कार्यान्वयन अत्यधिक शक है कि वे यादृच्छिक मॉड्यूल एक बिल्कुल अलग कलन विधि का उपयोग लागू करेगा।

+0

यही मैंने सोचा था। मैं शायद इसे कम से कम सबसे खराब समाधान के रूप में करूँगा। – Joe

+0

भले ही वे एक पूरी तरह से अलग एल्गोरिदम का उपयोग करते हैं, यदि आपने एक ही बीज को एक ही छद्म यादृच्छिक एल्गोरिदम में दिया है तो यह संख्याओं के समान अनुक्रम को थूक देगा - यदि आप अजगर के दो अलग-अलग कार्यान्वयन पर परीक्षण करना चाहते हैं तो आप समस्याओं में भाग लेंगे कि एक अलग एल्गोरिदम का इस्तेमाल किया लेकिन यह इसके बारे में है। लेकिन जैसा कि मैं दस्तावेज़ों को समझता हूं वे अंतर्निहित एल्गोरिदम भी गारंटी देते हैं, तो यह ठीक है। – Voo

+0

यह मेरे लिए होता है कि यदि आपके पास 32-बिट मेर्सन ट्विस्टर बनाम 64-बिट मेर्सन ट्विस्टर – DrRobotNinja

6

यादृच्छिक संख्या जनरेटर के लिए एक बीज निर्दिष्ट करें। यदि आप एक ही बीज प्रदान करते हैं, तो आपकी यादृच्छिक संख्या भी वही होनी चाहिए।

http://docs.python.org/library/random.html#random.seed

+0

मैंने यही सोचा, लेकिन जैसा कि मैंने इस सवाल में कहा था, मैं इसे वापस करने वाले किसी दस्तावेज़ को नहीं देख सकता। – Joe

+1

क्या आपने एक ही बीज का उपयोग करने और आउटपुट को देखने का प्रयास किया है? – Oleksi

+2

http://www.tutorialspoint.com/python/number_seed.htm –

4

random.seed (...) आप एक repeatable अनुक्रम उत्पन्न कर सकते हैं का उपयोग करना। एक प्रदर्शन:

import random 

random.seed(321) 
list1 = [random.randint(1,10) for x in range(5)] 

random.seed(321) 
list2 = [random.randint(1,10) for x in range(5)] 

assert(list1==list2) 

यह काम करता है क्योंकि random.seed (...) सही मायने में यादृच्छिक नहीं है: यह छद्म यादृच्छिक है, जिससे लगातार नंबर, कुछ राज्य मशीन permuting द्वारा उत्पादित कर रहे हैं एक प्रारंभिक प्रारंभिक हालत को देखते हुए ' बीज '।

import random 
random.seed(1) 
random.random() 
random.random() 
random.random() 

random.seed(1) 
random.random() 
random.random() 
random.random() 

मैं कई बार से अधिक विभिन्न गति पर CLI पर प्रत्येक पंक्ति में प्रवेश किया:

0

मैं सिर्फ निम्नलिखित की कोशिश की। हर बार एक ही मूल्य का उत्पादन किया।

4

यादृच्छिक संख्या की गुणवत्ता repeatability-भर-प्लेटफॉर्म के रूप में के रूप में महत्वपूर्ण नहीं है, तो आप पारंपरिक linear congruential generators से एक का उपयोग कर सकते हैं:

class lcg(object): 
    def __init__(self, seed=1): 
     self.state = seed 

    def random(self): 
     self.state = (self.state * 1103515245 + 12345) & 0x7FFFFFFF 
     return self.state 

इस के बाद से पूर्णांक गणित का उपयोग कर अपने कार्यक्रम में कोडित है , यह किसी भी उचित मंच पर निश्चित रूप से दोहराने योग्य होना चाहिए।

+0

शानदार है, तो मुझे अभी भी अलग-अलग परिणाम मिल सकते हैं, मैं इसे देख लूंगा। – Joe

20

इस उद्देश्य के लिए, मैंने एक दोहराना एमडी 5 हैश का उपयोग किया है, क्योंकि हैशिंग फ़ंक्शन का इरादा एक क्रॉस-प्लेटफ़ॉर्म एक-से-एक रूपांतरण है, इसलिए यह हमेशा विभिन्न प्लेटफ़ॉर्म पर समान होगा।

import md5 

def repeatable_random(seed): 
    hash = seed 
    while True: 
     hash = md5.md5(hash).digest() 
     for c in hash: 
      yield ord(c) 

def test(): 
    for i, v in zip(range(100), repeatable_random("SEED_GOES_HERE")): 
     print v 

आउटपुट:

184 207 76 134 103 171 90 41 12 142 167 107 84 89 149 131 142 43 241 211 224 157 47 59 34 233 41 219 73 37 251 194 15 253 75 145 96 80 39 179 249 202 159 83 209 225 250 7 69 218 6 118 30 4 223 205 91 10 122 203 150 202 99 38 192 105 76 100 117 19 25 131 17 60 251 77 246 242 80 163 13 138 36 213 200 135 216 173 92 32 9 122 53 250 80 128 6 139 49 94 

अनिवार्य रूप से, कोड अपने बीज (किसी भी मान्य स्ट्रिंग) लेने के लिए और बार-बार यह हैश, इस प्रकार 255

+0

यह एक शानदार विचार है! – Joe

9

0 से पूर्णांकों पैदा वहाँ मंच मतभेद हैं जाएगा , इसलिए यदि आप अपने कोड को विभिन्न प्लेटफार्मों के बीच ले जाते हैं तो मैं उस विधि के लिए जाऊंगा जो DrRobotNinja ने वर्णित किया था।

कृपया निम्नलिखित उदाहरण देखें। मेरे डेस्कटॉप मशीन पर अजगर (एक कोर i7 के साथ 64-बिट Ubuntu, पायथन 2.7.3) मुझे देता है निम्नलिखित:

> import random 
> r = random.Random() 
> r.seed("test") 
> r.randint(1,100) 
18 

लेकिन अगर मैं अपने रास्पबेरी Pi (ARM11 पर Raspbian) पर एक ही कोड चलाने के लिए, मैं

यह क्योंकि है जब यादृच्छिक जनरेटर बोने बीज है:

> import random 
> r = random.Random() 
> r.seed("test") 
> r.randint(1,100) 
34 
+0

दिलचस्प! इस पर ध्यान दिलाने के लिए धन्यवाद। – Joe

+0

मुझे नहीं पता कि यह एक दस्तावेज व्यवहार है या नहीं। यह अजीब लगता है कि यह मंच निर्भर होना चाहिए, जब पाइथन मानक पुस्तकालय का इतना बड़ा हिस्सा क्रॉस प्लेटफॉर्म पर काम करने के लिए डिज़ाइन किया गया है। शायद मुझे पाइथन टीम के साथ एक बग फाइल करना चाहिए? – Joppe

+0

यह एक अच्छा विचार है (पहली बार बग रिपोर्ट के माध्यम से देखकर)। यदि यह एक बग नहीं है तो एक अच्छा स्पष्टीकरण क्यों होगा। – Joe

5

इसके अलावा एक जवाब क्यों this answer से उदाहरण विभिन्न मशीनों पर विभिन्न उत्पादन का उत्पादन करता है (अजगर के समान संस्करण के लिए) आ अलग परिणाम प्राप्त एक पूर्णांक संख्या होने के लिए। यदि आप जेनरेटर को कुछ गैर-पूर्णांक वाले बीज देते हैं तो इसे पहले धोना होगा। हैश फ़ंक्शन स्वयं स्वयं प्लेटफॉर्म स्वतंत्र नहीं हैं (स्पष्ट रूप से कम से कम उन सभी को नहीं, अगर आप और जानते हैं तो मुझे सही करें)।

तो इसे सभी को एक साथ खींचने के लिए: पायथन एक छद्म-यादृच्छिक संख्या जनरेटर का उपयोग करता है। इसलिए, जब एक ही राज्य से शुरू किया गया, तो यादृच्छिक संख्याओं का उत्पादित क्रम हमेशा प्लेटफॉर्म से स्वतंत्र होगा। यह बाहरी दुनिया से आगे इनपुट के बिना सिर्फ एक गणित एल्गोरिदम है।

इसका मतलब है: जब तक आप एक ही स्थिति के साथ अपने यादृच्छिक जनरेटर को प्रारंभ करते हैं, तो यह संख्याओं के समान अनुक्रम का उत्पादन करेगा। एक ही राज्य को प्राप्त करना एक ही पूर्णांक बीज का उपयोग करके या पुराने राज्य को सहेजने और पुन: लागू करके किया जा सकता है (random.getstate() और random.setstate())।

+0

यह वास्तविक है, अगर आंशिक उत्तर है, और निश्चित रूप से जानकारी जोड़ता है। अगर मैं तुम थे, तो मैं शीर्ष पर क्षमा चाहता हूं! – Joe

+0

यह बहुत छोटा शुरू हुआ लेकिन एक विस्तृत उत्तर में विकसित हुआ, इसलिए आप सही हैं, और मैंने इसे हटा दिया/फिर से हटा दिया। –

संबंधित मुद्दे