我如何从数组中随机select?

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

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

是否有更可读/更简单的replace第二行? 或者,这是最好的办法。 我想你可以做myArray.shuffle.first ,但是我只在几分钟前看过#shuffle ,所以我还没有真正使用它。

只需使用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 ; 它在以后的版本中被重新命名,所以你不应该使用它。

尽pipe在这种情况下没有用处,但是如果您需要大量不同的样本,则sample接受一个数字参数。

myArray.sample(x)也可以帮助你从数组中获得x个随机元素。

随机数从一个数组中随机项目

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

就个人而言,我更喜欢方法item = myArray.random_element

更新:如果你不使用rails(主动支持),你需要自己定义方法。 请参阅Marc-AndréLafortune的更现代的观点。 如果您使用的是ruby版本<1.9.1,您也可以定义与此类似的Array#示例方法。

 class Array def random_element self[rand(length)] end end 
 myArray.sample 

将返回1个随机值。

 myArray.shuffle.first 

也会返回1个随机值。