关于ruby:如何从数组中随机选择?

How do I pick randomly from an array?

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

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

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


是的Array#sample使用: </P >

1
[:foo, :bar].sample # => :foo, or :bar :-)

它是可用的在ruby 1.9.1 +。。。。。。。TO BE也能使用它与红宝石简慢的版本,你可以require"backports/1.9.1/array/sample"。。。。。。。 </P >

值得注意的是,在它的红宝石1.8.7 exists下设unfortunate name choice;它是renamed在以后的版本,你不必使用T说的。 </P >

尽管从诺特是有用的在这个案例,sampleaccepts a number argument案例中你想要一个数的distinct样品。 </P >


myArray.sample(x)也可以帮助你得到的X的随机元素从数组的。 </P >


1
myArray.sample

将返回1的随机值。 </P >

1
myArray.shuffle.first

威尔也回报1的随机值。 </P >


随机数的随机数组中的项目

1
2
3
def random_items(array)
  array.sample(1 + rand(array.count))
end

可能的结果:实例研究

1
2
3
4
5
6
my_array = ["one","two","three"]
my_array.sample(1 + rand(my_array.count))

=> ["two","three"]
=> ["one","three","two"]
=> ["two"]


1
2
arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)]

这将返回一个随机元阵列中。 </P >

如果你会使用下面的这些线 </P >

1
arr[1+rand(arr.count)]

在一些案件中,那么它将返回0值或零。 </P >

下面的这些线 </P >

1
rand(number)

总是返回的值从0到1号。 </P >

如果我们使用 </P >

1
1+rand(number)

然后,它会返回号码和ARR [数] contains NO元。 </P >