Wie wähle ich zufällig aus einem Array aus?


559

Ich möchte wissen, ob es dafür einen viel saubereren Weg gibt. Grundsätzlich möchte ich ein zufälliges Element aus einem Array variabler Länge auswählen. Normalerweise würde ich es so machen:

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

Gibt es etwas, das besser lesbar / einfacher ist, um die zweite Zeile zu ersetzen? Oder ist das der beste Weg, es zu tun. Ich nehme an, Sie könnten es tun myArray.shuffle.first, aber ich habe es erst vor #shuffleein paar Minuten auf SO gesehen, ich habe es noch nicht wirklich benutzt.


13
Gute Antwort unten, aber ein allgemeiner Punkt zum Mischen. Ich würde mir vorstellen, dass das Suffling des gesamten Arrays viel intensiver wäre, als nur eine Zufallszahl zu erhalten, also wäre es keine gute Richtung.
Derek Organ

Antworten:


1127

Verwenden Sie einfach Array#sample:

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

Es ist in Ruby 1.9.1+ verfügbar. Um es auch mit einer früheren Version von Ruby verwenden zu können, können Sie require "backports/1.9.1/array/sample".

Beachten Sie, dass es in Ruby 1.8.7 unter dem unglücklichen Namen existiert choice. Es wurde in einer späteren Version umbenannt, daher sollten Sie es nicht verwenden.

Obwohl dies in diesem Fall nicht sinnvoll ist, wird ein sampleZahlenargument akzeptiert, falls Sie mehrere unterschiedliche Stichproben wünschen.


1
Ich hätte wissen müssen, dass Sie eine perfekte Antwort für mich haben würden (da die meisten Ruby-Fragen, die ich hier durchsuche, irgendwo Ihre Eingabe haben). Ich bin froh, dass Sie auf die Versionierung hingewiesen haben. Ich benutze 1.9.2. apidock (mladens Kommentar) hat keine Probe; Ruby-Doc auch nicht. Was ist Ihrer Meinung nach die beste Referenz für Ruby, aktualisiert auf 1.9?
Paul Hoffer

Ist es richtig, die "richtige Antwort" zu ändern, nachdem ich zum ersten Mal eine andere Antwort ausgewählt habe?
Paul Hoffer


Ich habe festgestellt, dass Ihre Bearbeitung die Erwähnung von 1.8.8 entfernt hat. Ist es noch in 1.8-head verfügbar und Sie bearbeiten nur die Frage, weil 1.8.8 nicht passieren wird?
Andrew Grimm

3
@ Andrew: Ja, ich habe meine Antwort bearbeitet, weil 1.8.8 nicht passieren wird. Es sollte immer noch in 1,8-Kopf sein, aber dieser Zweig ist tot :-(
Marc-André Lafortune

84

myArray.sample(x) kann Ihnen auch helfen, x zufällige Elemente aus dem Array zu erhalten.


6
Es ist erwähnenswert, dass my_array.sample (1)! = My_array.sample
Redithion

5
@ Redithion Es ist auch erwähnenswert, dass der Unterschied zwischen: my_array.sample (1) == [sample] und my_array.sample == sample explizit angibt, was Sie meinen
Ekkstein


12

Zufällige Anzahl zufälliger Elemente aus einem Array

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

Beispiele für mögliche Ergebnisse:

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

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

@fwilson zufällige Sammlungen von Objekten in beliebiger Reihenfolge. Auch gut zum Testen verschiedener Kombinationen oder zum Generieren von Stub-Daten
Mike Rapadas

Warum nicht die Klasse Array erweitern? [] .total_random wäre viel cooler. Komm schon, sein Rubin. sein Ziel!
Tim Kretschmer

Dies würde niemals ein leeres Array zurückgeben. Sie müssen an 1 +einem anderen Ort platzieren.
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)]

Dies gibt ein zufälliges Element aus dem Array zurück.

Wenn Sie die unten genannte Zeile verwenden

arr[1+rand(arr.count)]

In einigen Fällen wird dann der Wert 0 oder Null zurückgegeben.

Die unten erwähnte Zeile

rand(number)

Geben Sie immer den Wert von 0 bis Nummer 1 zurück.

Wenn wir verwenden

1+rand(number)

dann kann es Nummer zurückgeben und arr [Nummer] enthält kein Element.


-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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.