मैं किसी सरणी से यादृच्छिक रूप से कैसे चुनूं?


559

मैं जानना चाहता हूं कि क्या ऐसा करने का कोई ज्यादा साफ-सुथरा तरीका है। मूल रूप से, मैं चर लंबाई की एक सरणी से एक यादृच्छिक तत्व चुनना चाहता हूं। आम तौर पर, मैं इसे इस तरह से करूंगा:

myArray = ["stuff", "widget", "ruby", "goodies", "java", "emerald", "etc" ]
item = myArray[rand(myarray.length)]

क्या कुछ ऐसा है जो दूसरी पंक्ति को बदलने के लिए अधिक पठनीय / सरल है? या कि यह करने का सबसे अच्छा तरीका है। मुझे लगता है कि आप कर सकते थे myArray.shuffle.first, लेकिन मैंने केवल #shuffleकुछ मिनट पहले एसओ पर देखा था, मैंने वास्तव में अभी तक इसका उपयोग नहीं किया है।


13
नीचे अच्छा जवाब लेकिन फेरबदल के बारे में एक सामान्य बिंदु। मुझे लगता है कि पूर्ण सरणी को झेलना एक यादृच्छिक संख्या प्राप्त करने की तुलना में बहुत अधिक गहन होगा ताकि यह जाने के लिए एक अच्छी दिशा न हो।
डेरेक अंग

जवाबों:


1127

बस उपयोग करें Array#sample:

[:foo, :bar].sample # => :foo, or :bar :-)

यह रूबी 1.9.1+ में उपलब्ध है। रूबी के पुराने संस्करण के साथ भी इसका उपयोग करने में सक्षम होने के लिए, आप कर सकते हैं require "backports/1.9.1/array/sample"

ध्यान दें कि रूबी 1.8.7 में यह दुर्भाग्यपूर्ण नाम के तहत मौजूद है choice; बाद के संस्करण में इसका नाम बदल दिया गया ताकि आपको इसका उपयोग न करना पड़े।

हालांकि इस मामले में उपयोगी नहीं है, sampleयदि आप अलग-अलग नमूनों की संख्या चाहते हैं तो संख्या तर्क स्वीकार करता है।


1
मुझे पता होना चाहिए कि आपके पास मेरे लिए एक सटीक उत्तर होगा (क्योंकि ज्यादातर रूबी के सवाल जो मैं यहां ब्राउज़ करता हूं, आपके पास उसका इनपुट कहीं है)। मुझे खुशी है कि आपने संस्करण की ओर इशारा किया; मैं 1.9.2 का उपयोग कर रहा हूं। apidock (mladen की टिप्पणी) के पास नमूना नहीं है; न तो माणिक-डॉक। आपकी राय में, रूबी के लिए सबसे अच्छा संदर्भ क्या है, जिसे 1.9 में अद्यतन किया गया है?
पॉल हॉफफर

एक साइड नोट पर, "सही उत्तर" को बदलने के बाद क्या मैंने पहली बार एक और उत्तर चुना है?
पॉल हॉफ़र

1
धन्यवाद :-) और हाँ, इसे प्रोत्साहित किया गया है (देखें meta.stackexchange.com/questions/19448/… )
Marc-André Lafortune

मैंने आपका संपादन 1.8.8 का उल्लेख हटाकर देखा। क्या यह अभी भी 1.8-सिर में उपलब्ध है, और आप केवल प्रश्न का संपादन कर रहे हैं क्योंकि 1.8.8 नहीं होगा?
एंड्रयू ग्रिम

3
@ और: हां, मैंने अपना जवाब संपादित किया क्योंकि 1.8.8 नहीं होगा। यह अभी भी 1.8-सिर में होना चाहिए, लेकिन यह शाखा मर चुकी है :-(
मार्क-एंड्रे लाफ्यून

84

myArray.sample(x) आप सरणी से x यादृच्छिक तत्व प्राप्त करने में भी मदद कर सकते हैं।


6
यह ध्यान देने योग्य है कि my_array.sample (1)! = My_array.sample
Redithion

5
@Redithion यह भी ध्यान देने योग्य है, कि अंतर: my_array.sample (1) == [नमूना] और my_array.sample == नमूना स्पष्ट रूप से आपको प्रदान करने के लिए क्या मतलब है
Ekkstein


12

एक ऐरे से रैंडम आइटम की रैंडम संख्या

def random_items(array)
  array.sample(1 + rand(array.count))
end

संभावित परिणामों के उदाहरण:

my_array = ["one", "two", "three"]
my_array.sample(1 + rand(my_array.count))

=> ["two", "three"]
=> ["one", "three", "two"]
=> ["two"]

@fwilson किसी भी क्रम में वस्तुओं का यादृच्छिक संग्रह। विभिन्न संयोजनों का परीक्षण करने या स्टब डेटा उत्पन्न करने के लिए भी अच्छा है
माइक रैपादास

वर्ग एरे का विस्तार क्यों नहीं? [] .total_random रास्ता कूलर होगा। आ गया इसकी रूबी। इसका उद्देश्य!
टिम क्रॉश्चेर

यह कभी खाली सरणी नहीं लौटाएगा। आपको 1 +एक अलग जगह पर रखने की आवश्यकता है।
आरा

0
arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)]

यह सरणी से एक यादृच्छिक तत्व लौटाएगा।

यदि आप नीचे उल्लिखित लाइन का उपयोग करेंगे

arr[1+rand(arr.count)]

फिर कुछ मामलों में यह 0 या शून्य मान लौटाएगा।

नीचे दी गई लाइन

rand(number)

हमेशा मान 0 से संख्या -1 पर लौटाएं।

अगर हम उपयोग करते हैं

1+rand(number)

फिर यह संख्या वापस कर सकता है और गिरफ्तार कर सकता है [संख्या] में कोई तत्व नहीं है।


-2
class String

  def black
    return "\e[30m#{self}\e[0m"
  end

  def red
    return "\e[31m#{self}\e[0m"
  end

  def light_green
    return "\e[32m#{self}\e[0m"
  end

  def purple
    return "\e[35m#{self}\e[0m"
  end

  def blue_dark
    return "\e[34m#{self}\e[0m"
  end

  def blue_light
    return "\e[36m#{self}\e[0m"
  end

  def white
    return "\e[37m#{self}\e[0m"
  end


  def randColor
    array_color = [
      "\e[30m#{self}\e[0m",
      "\e[31m#{self}\e[0m",
      "\e[32m#{self}\e[0m",
      "\e[35m#{self}\e[0m",
      "\e[34m#{self}\e[0m",
      "\e[36m#{self}\e[0m",
      "\e[37m#{self}\e[0m" ]

      return array_color[rand(0..array_color.size)]
  end


end
puts "black".black
puts "red".red
puts "light_green".light_green
puts "purple".purple
puts "dark blue".blue_dark
puts "light blue".blue_light
puts "white".white
puts "random color".randColor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.