Как выбрать случайный выбор из массива?

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

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