Bir diziden rastgele nasıl seçerim?


559

Bunu yapmanın daha temiz bir yolu olup olmadığını bilmek istiyorum. Temel olarak, değişken uzunluktaki bir diziden rastgele bir öğe seçmek istiyorum. Normalde şöyle yaparım:

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

İkinci satırı değiştirmek için daha okunabilir / daha basit bir şey var mı? Yoksa bunu yapmanın en iyi yolu bu. Sanırım yapabilirsin myArray.shuffle.first, ama sadece #shufflebirkaç dakika önce SO'da gördüm , henüz kullanmadım.


13
Aşağıda iyi cevap ama shuffle hakkında genel bir nokta. Ben tam dizi acı sadece rastgele bir sayı elde daha çok daha yoğun olacağını hayal ediyorum, bu yüzden gitmek için iyi bir yön olmazdı.
Derek Organ

Yanıtlar:


1127

Sadece kullanın Array#sample:

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

Ruby 1.9.1 ve sonraki sürümleri mevcuttur. Ayrıca Ruby'nin önceki bir sürümüyle kullanabilmek için de kullanabilirsiniz require "backports/1.9.1/array/sample".

Ruby 1.8.7'de talihsiz isim altında var olduğunu unutmayın choice; daha sonraki bir sürümde yeniden adlandırıldı, bu yüzden bunu kullanmamalısınız.

Bu durumda yararlı olmasa da, sampleçok sayıda farklı örnek istemeniz durumunda bir sayı argümanı kabul eder.


1
Benim için mükemmel bir cevabın olacağını biliyor olmalıydım (burada göz attığım Ruby sorularının çoğunun bir yere girdisi olduğu için). Versiyonu belirttiğinize sevindim; 1.9.2 kullanıyorum. apidock'un (mladen'in yorumu) örneği yoktur; ruby-doc de öyle. Sizce, 1.9 için güncellenen Ruby için en iyi referans nedir?
Paul Hoffer

Yan notta, başka bir cevap seçtikten sonra "doğru cevabı" değiştirmek uygun mudur?
Paul Hoffer

1
Teşekkürler :-) Ve evet, teşvik edilir (bkz. Meta.stackexchange.com/questions/19448/… )
Marc-André Lafortune

Düzenlemenizin 1.8.8'den kaldırıldığını fark ettim. Hala 1.8 kafalı mı ve 1.8.8 gerçekleşmeyeceği için soruyu düzenliyorsunuz?
Andrew Grimm

3
@Andrew: Evet, cevabımı düzenledim çünkü 1.8.8 olmayacak. Hala 1.8 kafalı olmalı, ama bu dal öldü :-(
Marc-André Lafortune

84

myArray.sample(x) diziden x rastgele öğe almanıza da yardımcı olabilir.


6
My_array.sample (1)! = My_array.sample
Redithion

5
@Redithion Ayrıca şunu da belirtmek gerekir: my_array.sample (1) == [sample] ve my_array.sample == sample ne demek istediğinizi açıkça belirtmek için
Ekkstein


12

Bir Diziden Rastgele Rastgele Sayı Sayısı

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

Olası sonuçlara örnekler:

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

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

@fwilson herhangi bir sırada rastgele nesne koleksiyonları. Farklı kombinasyonları test etmek veya saplama verileri oluşturmak için de iyidir
Mike Rapadas

neden Array sınıfını genişletmiyorsunuz? [] .total_random çok daha soğuk olurdu. comeon onun yakut. amacı!
Tim Kretschmer

Bu asla boş bir dizi döndürmez. Sen yere ihtiyaç 1 +farklı bir yerde.
sawa

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)]

Bu, diziden rastgele bir öğe döndürür.

Aşağıda belirtilen satırı kullanacaksanız

arr[1+rand(arr.count)]

bazı durumlarda 0 veya sıfır değeri döndürür.

Aşağıda belirtilen satır

rand(number)

değeri her zaman 0'dan 1 numaraya döndürün.

Kullanırsak

1+rand(number)

bu durumda sayı döndürebilir ve arr [sayı] öğe içermez.


-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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.