रूबी में एक सरणी को कैसे बेतरतीब ढंग से (हाथापाई) करना है?


128

मैं अपने सरणी आइटम तले करना चाहते हैं। कुछ इस तरह:

[1,2,3,4].scramble => [2,1,3,4]
[1,2,3,4].scramble => [3,1,2,4]
[1,2,3,4].scramble => [4,2,3,1]

और इसी तरह, बेतरतीब ढंग से

जवाबों:


293

अब में निर्मित:

[1,2,3,4].shuffle => [2, 1, 3, 4]
[1,2,3,4].shuffle => [1, 3, 2, 4]

3
और यदि आप इसे स्वयं लागू करना चाहते हैं: en.wikipedia.org/wiki/Fisher-Yates_shuffle
जॉय

या यदि आप इसे रूबी के लिए चाहते हैं <1.9: 'बैकपोर्ट' की आवश्यकता है
मार्क-एंड्रे लाफ्यून जून

1
ऐसा लगता है कि यह रूबी 1.8.7 में भी है।
ब्रायन आर्मस्ट्रांग

यह पूरी तरह से भयानक है।
सिडनी

1
बस जोड़ना चाहता था: यदि आप संग्रह को प्रभावित करना चाहते हैं तो !फेरबदल करने के लिए कॉल के बाद जोड़ें । बिना !फेरबदल के सरणी वापस आ गई है, और एक असाइनमेंट के लिए पका हुआ है।
मुइवा ओलू

27

रूबी 1.8.6 के लिए (जिसमें फेरबदल नहीं किया गया है):

array.sort_by { rand }

11
@ जोश: वह पृष्ठ जिससे आप पूरी तरह से अलग एल्गोरिथ्म का वर्णन करते हैं। ध्यान दें कि रूबी का sort_byकार्य जावास्क्रिप्ट के सॉर्ट फ़ंक्शन (या उस मामले के लिए रूबी का प्रकार फ़ंक्शन) की तरह काम नहीं करता है, जो केवल यह ध्यान रखता है कि क्या गणना की गई संख्या शून्य से कम है, शून्य या शून्य से अधिक है। इसके बजाय sort_byप्रत्येक आइटम के लिए गणना किए गए मूल्य को याद करता है और फिर उस मूल्य द्वारा आइटम को सॉर्ट करता है। तो इस मामले में प्रत्येक आइटम को एक यादृच्छिक संख्या दी जाती है और फिर उन यादृच्छिक संख्याओं द्वारा सरणी को क्रमबद्ध किया जाता है।
sepp2k

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

9

Sepp2k के उदाहरण के रूप में रूबी 1.8.6, लेकिन आप अभी भी "फेरबदल" विधि का उपयोग करना चाहते हैं।

class Array
  def shuffle
    sort_by { rand }
  end
end

[1,2,3,4].shuffle #=> [2,4,3,1]
[1,2,3,4].shuffle #=> [4,2,1,3]

चियर्स


2

रूबी 1.8.6 के लिए ऐरे के लिए बैकपोर्ट जेम से कोड । रूबी 1.8.7 या उच्चतर में बनाया गया है।

class Array
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
  def shuffle
    dup.shuffle!
  end unless method_defined? :shuffle

  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
  def shuffle!
    size.times do |i|
      r = i + Kernel.rand(size - i)
      self[i], self[r] = self[r], self[i]
    end
    self
  end unless method_defined? :shuffle!
end

0

रूबी पहलुओं एक्सटेंशन के पुस्तकालय एक है Randomमॉड्यूल जो सहित उपयोगी तरीके प्रदान shuffleऔर shuffle!सहित मुख्य वर्गों में से एक गुच्छा के लिए Array, Hashऔर String

यदि आप रेल का उपयोग कर रहे हैं तो सावधान रहें क्योंकि मैंने कुछ खराब झड़पों का अनुभव किया है, क्योंकि इसके बंदर पकड़ने वाले रेल के साथ टकरा गए थे ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.