2010-08-27 15 views
5

रुबी 1.9.2 में Random कक्षा एक विशेष बीज और सीमा के अनुसार, उसी क्रम में यादृच्छिक संख्या उत्पन्न करने की गारंटी है।रुबी में वितरित अनुक्रमिक यादृच्छिक संख्या पीढ़ी 1.9.2

r = Random.new(23) 
r.rand(100)   # 83 
r.rand(100)   # 40 

लेकिन लगता है मुझे (अनुक्रम में पहले नंबर पुन: तैयार करने के बिना) किसी अन्य कंप्यूटर पर क्रम में अगला नंबर उत्पन्न करना चाहते हैं: उदाहरण के लिए। पिछले आउटपुट को देखते हुए यह संभव होना चाहिए। Random कक्षा के साथ ऐसा करने का कोई तरीका है? या मुझे Mersenne twister का अपना कार्यान्वयन लिखना है?

[संपादित करें: के रूप में नीचे टिप्पणी में बताया, यह वास्तव में संभव है, सिर्फ उत्पादन से एक Random उदाहरण की स्थिति का निर्धारण करने के लिए है, क्योंकि राज्य का ही हिस्सा (विशेष रूप से, कम 32 बिट) आउटपुट के लिए उपयोग किया जाता है।]

+0

ऐसा करना क्यों संभव होना चाहिए? – adamse

+0

@adamse अगली संख्या 'आर' में कुछ आंतरिक स्थिति को निश्चित रूप से दी गई है। तो यदि आप पुराने राज्य के समान राज्य के साथ एक नया 'आर' बनाते हैं, तो यह अनुक्रम में अगला नंबर उत्पन्न करेगा। समझ में आता है? 'रैंडम' के अंतर्गत एल्गोरिदम की मेरी समझ के आधार पर, मेरा मानना ​​है कि इस राज्य को बीज और अंतिम उत्पन्न संख्या द्वारा दर्शाया जा सकता है। –

+0

[पिछलापोर्ट] पढ़ना (http://github.com/marcandre/backports/blob/master/lib/backports/1.9.2/random/MT19937.rb) कार्यान्वयन ऐसा लगता है कि वास्तव में आप अगले राज्य को ढूंढकर देख सकते हैं अंतिम और बीज। हालांकि जहां तक ​​मैं समझता हूं कि आप उत्पन्न संख्या को देखते हुए राज्य नहीं ढूंढ पाएंगे। – adamse

उत्तर

2

परीक्षण नहीं कर सकता है, लेकिन जनरेटर को मार्क-एंड्रे लाफोर्ट्यून here के अनुसार मार डाला जा सकता है। तो यह काम कर सकता है:

r = Random.new(23) 
r.rand(100)   # 83 
r.rand(100)   # 40 

File.open("/path/to/file","w") do |f| 
    Marshal.dump(r,f) 
end 

# later, may be on another computer 

File.open("/path/to/file","r") do |f| 
    @v = Marshal.load(f) 
end 

puts @v.rand(100) 
+0

यह काम कर सकता है, लेकिन यह बहुत अक्षम लगता है। सिद्धांत रूप में, आपको केवल एक कंप्यूटर से दूसरे कंप्यूटर पर सबसे हाल ही में जेनरेट किए गए मान को प्रेषित करने की आवश्यकता होनी चाहिए; आपको पूरी वस्तु को क्रमबद्ध करने की आवश्यकता नहीं है। –

+1

आप यह धारणा कर रहे हैं कि कोई अन्य आंतरिक स्थिति नहीं है। आप निश्चित रूप से एक यादृच्छिक संख्या जनरेटर लिख सकते हैं जिसके लिए यह सच है (सबसे आसान तरीका: बीज मूल्य के रूप में पहले नंबर के साथ यादृच्छिक पुन: प्रारंभ करना, और केवल पहली कॉल का उपयोग करें) लेकिन यह कहना वास्तव में उचित नहीं है कि वर्तमान रैंडम क्लास " सिद्धांत रूप में "एक असामान्य उपयोग के मामले के लिए statelessness बनाए रखना चाहिए। – SFEley

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