¿Cómo elijo aleatoriamente de una matriz?

Quiero saber si hay una manera mucho más limpia de hacer esto. Básicamente, quiero elegir un elemento aleatorio de una matriz de longitud variable. Normalmente, lo haría así:

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

¿Hay algo que sea más legible / más simple para reemplazar la segunda línea? ¿O es esa la mejor manera de hacerlo? Supongo que puedes hacer myArray.shuffle.first , pero solo vi #shuffle hace unos minutos en SO, aún no lo he usado.

Solo use la Array#sample :

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

Está disponible en Ruby 1.9.1+. Para poder utilizarlo también con una versión anterior de Ruby, puede require "backports/1.9.1/array/sample" .

Tenga en cuenta que en Ruby 1.8.7 existe bajo la desafortunada choice nombre; fue renombrado en una versión posterior por lo que no debería usar eso.

Aunque no es útil en este caso, la sample acepta un argumento numérico en caso de que desee un número de muestras distintas.

myArray.sample(x) también puede ayudarte a obtener x elementos aleatorios de la matriz.

Número aleatorio de elementos aleatorios de una matriz

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

Ejemplos de posibles resultados:

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

devolverá 1 valor aleatorio.

 myArray.shuffle.first 

también devolverá 1 valor aleatorio.

Personalmente, preferiría el método item = myArray.random_element .

ACTUALIZACIÓN: Si no está utilizando los Rails (soporte activo) deberá definir el método usted mismo. Vea la respuesta de Marc-André Lafortune para una visión más moderna. También puede definir el método de muestra Array # similar a esto, si está utilizando la versión de ruby ​​<1.9.1.

 class Array def random_element self[rand(length)] end end 
 arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9] arr[rand(arr.count)] 

Esto devolverá un elemento aleatorio de la matriz.

Si usará la línea mencionada a continuación

 arr[1+rand(arr.count)] 

luego, en algunos casos, devolverá 0 o ningún valor.

La línea mencionada a continuación

 rand(number) 

siempre devuelve el valor de 0 a número-1.

Si usamos

 1+rand(number) 

entonces puede devolver el número y arr [number] no contiene ningún elemento.