Как выбрать случайным образом из массива? - PullRequest
528 голосов
/ 14 августа 2010

Я хочу знать, есть ли более чистый способ сделать это. По сути, я хочу выбрать случайный элемент из массива переменной длины. Обычно я бы сделал это так:

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

Есть ли что-то, что более читабельно / проще заменить вторую строку? Или это лучший способ сделать это. Я полагаю, вы могли бы сделать myArray.shuffle.first, но я видел #shuffle всего несколько минут назад на SO, но я еще не использовал его.

Ответы [ 5 ]

1062 голосов
/ 14 августа 2010

Просто используйте Array#sample:

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

Доступно в Ruby 1.9.1+.Чтобы также использовать его с более ранней версией Ruby, вы можете require "backports/1.9.1/array/sample".

. Обратите внимание, что в Ruby 1.8.7 он существует под неудачным именем choice;в более поздней версии оно было переименовано, поэтому его не следует использовать.

Хотя в этом случае это бесполезно, sample принимает числовой аргумент в случае, если требуется несколько различных выборок.

79 голосов
/ 04 июля 2013

myArray.sample(x) также может помочь вам получить x случайных элементов из массива.

12 голосов
/ 07 октября 2013

Случайное количество случайных элементов из массива

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

Примеры возможных результатов:

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

=> ["two", "three"]
=> ["one", "three", "two"]
=> ["two"]
11 голосов
/ 22 октября 2013
myArray.sample

вернет 1 случайное значение.

myArray.shuffle.first

также вернет 1 случайное значение.

0 голосов
/ 29 июня 2018
arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)]

Это вернет случайный элемент из массива.

Если Вы будете использовать строку, указанную ниже

arr[1+rand(arr.count)]

, тогда в некоторых случаях он вернет 0 или ноль.

Строка, упомянутая ниже

rand(number)

всегда возвращает значение от 0 до числа-1.

Если мы используем

1+rand(number)

тогда он может вернуть число, а arr [number] не содержит элементов.

...