Come scelgo casualmente da un array?


559

Voglio sapere se esiste un modo molto più pulito di farlo. Fondamentalmente, voglio scegliere un elemento casuale da una matrice di lunghezza variabile. Normalmente, lo farei così:

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

C'è qualcosa che è più leggibile / più semplice per sostituire la seconda riga? O è il modo migliore per farlo. Suppongo che tu possa fare myArray.shuffle.first, ma ho visto solo #shufflepochi minuti fa su SO, non l'ho ancora usato.


13
Buona risposta di seguito, ma un punto generale sullo shuffle. Immagino che soffocare l'intero array sarebbe molto più intenso di un semplice numero casuale, quindi non sarebbe una buona direzione da percorrere.
Derek Organ

Risposte:


1127

Usa solo Array#sample:

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

È disponibile in Ruby 1.9.1+. Per poterlo usare anche con una versione precedente di Ruby, potresti farlo require "backports/1.9.1/array/sample".

Si noti che in Ruby 1.8.7 esiste sotto il nome sfortunato choice; è stato rinominato nella versione successiva, quindi non dovresti usarlo.

Sebbene non sia utile in questo caso, sampleaccetta un argomento numerico nel caso in cui si desideri un numero di campioni distinti.


1
Avrei dovuto sapere che avresti avuto una risposta perfetta per me (dato che la maggior parte delle domande su Ruby che sfoglio qui hanno il tuo contributo da qualche parte). Sono contento che tu abbia sottolineato il controllo delle versioni; Sto usando 1.9.2. apidock (commento di Mladen) non ha un campione; neanche ruby-doc. Secondo te, qual è il miglior riferimento per Ruby, aggiornato alla 1.9?
Paul Hoffer,

In una nota a margine, è corretto cambiare la "risposta corretta" dopo aver selezionato un'altra risposta?
Paul Hoffer,

1
Grazie :-) E sì, è incoraggiato (vedi meta.stackexchange.com/questions/19448/… )
Marc-André Lafortune

Ho notato che la tua modifica rimuove la menzione di 1.8.8. È ancora disponibile in 1.8-head e stai solo modificando la domanda perché 1.8.8 non accadrà?
Andrew Grimm,

3
@Andrew: Sì, ho modificato la mia risposta perché la 1.8.8 non accadrà. Dovrebbe essere ancora in testa 1.8, ma quel ramo è morto :-(
Marc-André Lafortune,

84

myArray.sample(x) può anche aiutarti a ottenere x elementi casuali dall'array.


6
Vale la pena notare che my_array.sample (1)! =
My_array.sample

5
@Redithion Vale anche la pena notare che la differenza tra: my_array.sample (1) == [sample] e my_array.sample == sample per fornire esplicitamente cosa intendi
Ekkstein


12

Numero casuale di elementi casuali da una matrice

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

Esempi di possibili risultati:

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

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

@fwilson collezioni casuali di oggetti in qualsiasi ordine. Buono anche per testare diverse combinazioni o generare dati di stub
Mike Rapadas,

perché non estendere l'array di classe? [] .total_random sarebbe molto più interessante. come il suo rubino. il suo obiettivo!
Tim Kretschmer,

Questo non restituirebbe mai un array vuoto. Devi posizionarti 1 +in un posto diverso.
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)]

Ciò restituirà un elemento casuale dall'array.

Se utilizzerai la linea indicata di seguito

arr[1+rand(arr.count)]

quindi in alcuni casi restituirà un valore pari a 0 o nullo.

La linea menzionata di seguito

rand(number)

restituisce sempre il valore da 0 a numero 1.

Se usiamo

1+rand(number)

quindi può restituire il numero e arr [numero] non contiene alcun elemento.


-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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.