2013-04-12 14 views
10

पुन: उत्पन्न करें मेरे पास ऑब्जेक्ट्स की एक सरणी है जिसे मैं यादृच्छिक रूप से सॉर्ट करना चाहता हूं। इस मामले के लिए मैं array.shuffle का उपयोग कर सकता हूं। लेकिन क्या होगा यदि मैं बाद में उसी क्रम पर उस क्रम को पुन: पेश करना चाहता हूं? क्या कोई तरीका है कि मैं एक बीज, यादृच्छिक संख्या, जो कुछ भी प्रदान कर सकता हूं, ताकि मैं बाद में इस अनुक्रम को पुन: पेश कर सकूं?यादृच्छिक सरणी सॉर्ट

मैं एक मोंगोडीबी डेटाबेस (मोंगोइड का उपयोग करके) की वस्तुओं की एक यादृच्छिक सूची उत्पन्न करना चाहता हूं, और उस सूची को बाद में पुन: उत्पन्न किया जाना है। लेकिन जहां तक ​​मुझे पता है, मोंगोडीबी में सीधे यादृच्छिक प्रकार को लागू करने के लिए कोई वास्तव में अच्छा तरीका नहीं है। बहुत सारी वस्तुएं हो सकती हैं (> 1,000,000), लेकिन गणना के समय पहली बार कोशिश करने के लिए महत्वपूर्ण तथ्य नहीं है।

उत्तर

19

यदि आप Ruby docs for Array#shuffle पर देखते हैं तो आप देखेंगे कि आप जनरेटर के रूप में Random पास कर सकते हैं; यदि आप प्रत्येक बार एक ही बीज का उपयोग करके शफल करने के लिए एक नया Random पास करते हैं, तो यह वही परिणाम देगा।

>> arr = %w{John Paul George Ringo} 
=> ["John", "Paul", "George", "Ringo"] 
>> arr.shuffle(random: Random.new(1)) 
=> ["Ringo", "John", "George", "Paul"] 
>> arr.shuffle(random: Random.new(1)) 
=> ["Ringo", "John", "George", "Paul"] 
>> arr.shuffle(random: Random.new(1)) 
=> ["Ringo", "John", "George", "Paul"] 

संपादित करें: यह एक Random का उपयोग कर (बल्कि एक नया एक के लिए हर बार की तुलना में से Array#shuffle, कई repeatable shufflings उत्पादन ताकि दोनों प्रत्येक व्यक्ति के फेरबदल और shufflings के अनुक्रम दोहराया जा सकता है, के लिए बढ़ाया जा सकता है) और दोहराए जाने के लिए उसी बीज के साथ इसे नवीनीकृत करना:

>> arr = [1, 2, 3, 4] => [1, 2, 3, 4] 
>> r = Random.new(17) => #<Random:0x000000017be4d0> 
>> arr.shuffle(random: r) => [3, 1, 4, 2] 
>> arr.shuffle(random: r) => [1, 3, 2, 4] 
>> arr.shuffle(random: r) => [4, 3, 2, 1] 
>> r = Random.new(17) => #<Random:0x00000001c60da8> 
>> arr.shuffle(random: r) => [3, 1, 4, 2] 
>> arr.shuffle(random: r) => [1, 3, 2, 4] 
>> arr.shuffle(random: r) => [4, 3, 2, 1] 
>> etc. 
?> 
+0

मेरे समाधान से काफी अच्छा है। इसे इस्तेमाल करो। –

+1

शांत, यह अच्छा लग रहा है। और मुझे आपकी बीटल्स उदाहरण पसंद है;) – 23tux

+1

इसे उत्तम दर्जे का रखना। – iamnotmaynard

2

विधि (http://ruby-doc.org/core-2.0/Array.html#method-i-shuffle) के स्रोत को देखने से, ऐसा लगता है कि यह क्रमबद्ध करने के लिए रूबी यादृच्छिक संख्या जनरेटर में गिर रहा है।

अगर ऐसा है, तो आप बीज

srand *seed number* 

साथ स्क्रिप्ट चलाने से पहले सेट कर सकते हैं। हालांकि, मैं इस पर 100% नहीं हूं, ऐसा लगता है, लेकिन मैं निश्चित रूप से इसके लिए यूनिट परीक्षण लिखूंगा!

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