如何从数组中随机选取?

时间:2010-08-14 05:26:50

标签: ruby arrays random

我想知道是否有更清洁的方法来做到这一点。基本上,我想从可变长度的数组中选择一个随机元素。通常情况下,我会这样做:

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

更换第二行是否有更易读/更简单的东西?或者这是最好的方法。我想你可以做myArray.shuffle.first,但我几分钟前才看到#shuffle,我还没有实际使用它。

6 个答案:

答案 0 :(得分:1052)

只需使用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会接受一个数字参数,以防您想要多个不同的样本。

答案 1 :(得分:78)

myArray.sample(x)还可以帮助您从数组中获取x个随机元素。

答案 2 :(得分:12)

数组中随机项的随机数

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"]

答案 3 :(得分:11)

myArray.sample

将返回1个随机值。

myArray.shuffle.first

也会返回1个随机值。

答案 4 :(得分:0)

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或nil值。

下面提到的行

rand(number)

始终将值从0返回到数字1。

如果我们使用

1+rand(number)

然后它可能返回数字,而arr [number]不包含任何元素。

答案 5 :(得分:0)

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