Cum pot alege aleatoriu dintr-o matrice? (Programare, Ruby, Array-Uri, Random)

Paul Hoffer a intrebat.

Vreau să știu dacă există o modalitate mult mai curată de a face acest lucru. Practic, vreau să aleg un element aleatoriu dintr-un array de lungime variabilă. În mod normal, aș face-o astfel:

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

Există ceva mai ușor de citit / mai simplu pentru a înlocui al doilea rând? Sau acesta este cel mai bun mod de a face acest lucru. Presupun că ați putea face myArray.shuffle.first, , dar am văzut doar #shuffle acum câteva minute pe SO, de fapt nu am folosit-o încă.

Comentarii

  • Răspuns bun mai jos, dar un punct general despre shuffle. Mi-aș imagina că suflarea întregului array ar fi mult mai intensivă decât obținerea unui număr aleatoriu, așa că nu ar fi o direcție bună de urmat. –  > Por Derek Organ.
6 răspunsuri
Marc-André Lafortune

Folosiți doar Array#sample:

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

Este disponibil în Ruby 1.9.1+. Pentru a-l putea utiliza și cu o versiune anterioară de Ruby, ați putea require "backports/1.9.1/array/sample".

Rețineți că în Ruby 1.8.7 există sub un nume nefericit choice; a fost redenumit în versiunile ulterioare, așa că nu ar trebui să îl folosiți.

Deși nu este util în acest caz, sample acceptă un argument numeric în cazul în care doriți un număr de eșantioane distincte.

Comentarii

  • Ar fi trebuit să știu că vei avea un răspuns perfect pentru mine (din moment ce majoritatea întrebărilor despre Ruby pe care le răsfoiesc aici au undeva contribuția ta). Mă bucur că ai subliniat versiunea; eu folosesc 1.9.2. apidock (comentariul lui mladen) nu are sample; nici ruby-doc. După părerea dumneavoastră, care este cea mai bună referință pentru Ruby, actualizată la 1.9? –  > Por Paul Hoffer.
  • Pe de altă parte, este corect să schimb „răspunsul corect” după ce am selectat mai întâi un alt răspuns? –  > Por Paul Hoffer.
  • Mulțumesc 🙂 Și da, este încurajat (vezi meta.stackexchange.com/questions/19448/… ) – -.  > Por Marc-André Lafortune.
  • Am observat că editarea ta a eliminat menționarea 1.8.8. Este încă disponibilă în 1.8-head și editați întrebarea doar pentru că 1.8.8.8 nu va fi disponibilă? –  > Por Andrew Grimm.
  • @Andrew: Da, mi-am editat răspunsul pentru că 1.8.8.8 nu va fi disponibil. Ar trebui să fie încă în 1.8-head, dar acea ramură este moartă 🙁 –  > Por Marc-André Lafortune.
beesasoh

myArray.sample(x) vă poate ajuta, de asemenea, să obțineți x elemente aleatorii din matrice.

Comentarii

  • Merită să rețineți că my_array.sample(1) != my_array.sample –  > Por Redithion.
  • @Redithion De asemenea, merită remarcat faptul că diferența dintre: my_array.sample(1) == [sample] și my_array.sample == sample pentru a oferi în mod explicit ceea ce vrei să spui –  > Por Ekkstein.
Mike Rapadas

Număr aleatoriu de elemente aleatorii dintr-un array

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

Exemple de rezultate posibile:

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

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

Comentarii

  • @fwilson colecții aleatoare de obiecte în orice ordine. De asemenea, bun pentru a testa diferite combinații sau pentru a genera date stub –  > Por Mike Rapadas.
  • de ce să nu extindem clasa Array? [].total_random ar fi mult mai tare. haideți că e ruby. e obiectiv! –  > Por Tim Kretschmer.
  • Acest lucru nu ar returna niciodată o matrice goală. Trebuie să plasați 1 + într-un alt loc. –  > Por sawa.
JJ21
myArray.sample

va returna 1 valoare aleatorie.

myArray.shuffle.first

va returna, de asemenea, 1 valoare aleatorie.

Comentarii

    26

  • Amestecul este superfluu. –  > Por superluminary.
  • Din punct de vedere tehnic, și această metodă aleatorie este corectă stackoverflow.com/a/84747/2047418 –  > Por Filip Bartuzi.
Muhammad Aamir
arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)]

Aceasta va returna un element aleatoriu din matrice.

Dacă veți utiliza linia menționată mai jos

arr[1+rand(arr.count)]

atunci în unele cazuri va returna 0 sau valoarea nulă.

Linia menționată mai jos

rand(number)

returnează întotdeauna valoarea de la 0 la numărul-1.

Dacă folosim

1+rand(number)

atunci este posibil să returneze un număr și arr[număr] să nu conțină niciun element.

Charon IV
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