2010-03-02 14 views
10

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

अभी, मैं भंडारण कर रहा हूँ जहाँ मैं और साथ ही प्रारंभिक बीज हूं और उसके बाद प्रारंभिक खंड जो मैं पहले से ही करने के लिए कुछ इसी तरह का उपयोग कर देखा है दूर फेंक:

sub consume_upto_n { 
    my ($seed, $n) = @_; 
    $n = 1 unless defined $n and $n >= 1; 
    srand $seed; 
    rand for 1 .. $n - 1; 
    return; 
} 

उदाहरण के लिए:

srand 0x18; 
my @v = map { rand } 1 .. 5; 

बाद में:

consume_upto_n(0x18, 3); 
my @z = map { rand } 3 .. 5; 

फिर, $z[0] == $v[2], 01,239,आदि

उत्तर

1

perl 5.13.4 के रूप में, srand returns the seed:

srand() अब बीज

रिटर्न इस प्रोग्राम नहीं करने के लिए repeatable परिणाम की आवश्यकता है कि अपने स्वयं के बीज पैदा तंत्र साथ आने के लिए अनुमति देता है। इसके बजाय, वे srand() का उपयोग कर सकते हैं और किसी भी तरह भविष्य के उपयोग के लिए वापसी को रोक सकते हैं। विशिष्ट एक परीक्षण कार्यक्रम है जिसमें प्रत्येक रन के लिए उपलब्ध समय में व्यापक रूप से परीक्षण करने के लिए बहुत से संयोजन होते हैं। यह प्रत्येक बार एक यादृच्छिक सबसेट का परीक्षण कर सकता है, और विफलता होनी चाहिए, उस दौड़ के लिए उपयोग किए गए बीज को लॉग इन करें ताकि बाद में इसका सटीक परिणाम पुन: उत्पन्न करने के लिए उपयोग किया जा सके।

6

मुझे नहीं लगता कि अंतर्निहित rand आपको ऐसा करने की अनुमति देता है। लेकिन आप एक विकल्प rand का उपयोग कर सकते हैं। उदाहरण के लिए, आपको serialize its objects (संभवतः $MRMA::PRNG सहित) की अनुमति देता है, जो ऑब्जेक्ट है जो इसके प्रतिस्थापन rand द्वारा उपयोग किया जाता है)।

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

+4

@cjm यह सिमुलेशन उद्देश्यों के लिए है। मान लें कि मेरे पास सिमुलेशन है जिसके लिए 10,000 ड्रॉ की आवश्यकता है। यादृच्छिक संख्या जनरेटर की गुणवत्ता इससे कोई फर्क नहीं पड़ता है लेकिन प्रतिलिपि बनाने की क्षमता (किसी दिए गए 'perl' + OS + ऐप संस्करण संयोजन के लिए) एक अनुक्रम अनुक्रम महत्वपूर्ण है। मैं इसे बीच में बाधित करने में सक्षम होना चाहता हूं और जहां से हमने छोड़ा था वहां से चुनना चाहता हूं। इस तरह, मैं प्रारंभिक बीज को संग्रहीत करके बाद में घटनाओं के सटीक अनुक्रम को दोहरा सकता हूं। –

+1

सीनान: ऐसी कई चीजें हैं जिनके लिए आप पूछ रहे हैं: कुछ मनमानी बिंदु पर अनुक्रम जारी रखने और सटीक उसी बिंदु को पुनरारंभ करने में सक्षम होने के नाते। दोनों को मैथ :: रैंडम :: * मॉड्यूल में से एक का उपयोग करके किया जा सकता है लेकिन पर्ल स्रोतों के एक कर्सर निरीक्षण से, यह एक्सएस से भी बिल्टिन रैंड() के साथ (आसानी से) नहीं किया जा सकता है! (पर्ल सी पुस्तकालय के रैंड() को अपने रैंड() के हिस्से के रूप में कॉल कर सकता है और कार्यान्वयन प्लेटफ़ॉर्म पर निर्भर करता है।) – tsee

+0

@cjm और @tsee यह बेहतर है कि 'रैंड' में निर्मित भरोसा न करें। –

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