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.

Paul Hoffer
quelle
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.

Marc-André Lafortune
quelle
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
1
Danke :-) Und ja, es wird empfohlen (siehe meta.stackexchange.com/questions/19448/… )
Marc-André Lafortune
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.

Beesasoh
quelle
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
14
myArray.sample

gibt 1 zufälligen Wert zurück.

myArray.shuffle.first

gibt auch 1 zufälligen Wert zurück.

JJ21
quelle
26
Das Mischen ist überflüssig.
Superleuchte
1
Technisch gesehen ist diese zufällige Methode auch korrekt. Stackoverflow.com/a/84747/2047418
Filip Bartuzi
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"]
Mike Rapadas
quelle
@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.

Muhammad Aamir
quelle
-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
Charon IV
quelle