Как выбрать случайный выбор из массива?
Я хочу знать, есть ли более чистый способ сделать это. В принципе, я хочу выбрать случайный элемент из массива переменной длины. Обычно я бы сделал это следующим образом:
myArray = ["stuff", "widget", "ruby", "goodies", "java", "emerald", "etc" ]
item = myArray[rand(myarray.length)]
Есть ли что-то более читаемое/более простое для замены второй строки? Или это лучший способ сделать это. Я предполагаю, что вы могли бы сделать myArray.shuffle.first
, но я только видел #shuffle
несколько минут назад на SO, я еще не использовал его еще.
Ответы
Ответ 1
Просто используйте 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
принимает числовой аргумент, если вы хотите получить несколько различных образцов.
Ответ 2
myArray.sample(x)
также может помочь вам получить x случайных элементов из массива.
Ответ 3
Случайное число случайных элементов из массива
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"]
Ответ 4
myArray.sample
вернет 1 случайное значение.
myArray.shuffle.first
также вернет 1 случайное значение.
Ответ 5
Лично я бы предпочел метод item = myArray.random_element
.
ОБНОВЛЕНИЕ: Если вы не используете рельсы (активная поддержка), вам необходимо определить метод самостоятельно. См. Marc-André Lafortune для более современного взгляда. Вы также можете определить метод образца Array #, аналогичный этому, если вы используете рубиновую версию < 1.9.1.
class Array
def random_element
self[rand(length)]
end
end
Ответ 6
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 [число] не содержит элемента.
Ответ 7
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