我如何从数组中随机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个随机值。