从Ruby中的Array中选择多个随机值,可以重复

时间:2015-01-11 15:22:35

标签: ruby arrays

如何从数组中随机选择多个项目,我可以确保重复元素。 Array#sample不合适,因为只有似乎才能选择一组独特的元素:

>> array = (1..5).to_a
=> [1, 2, 3, 4, 5]
>> 10.times.map { array.sample(2) }
=> [[4, 2], [5, 4], [5, 2], [1, 4], [2, 3], [1, 4], [4, 1], [4, 5], [3, 1], [3, 1]]
...

我可以执行以下操作以确保重复,但是想确认是否有更好的方法来考虑重复元素拾取。

random_value_1 = array.sample
random_value_2 = array.sample

谢谢你的时间!

4 个答案:

答案 0 :(得分:5)

要从数组中获取n可能重复的随机元素,除了

之外别无其他
n.times.map { ary.sample }

或者,如果你从一个范围中挑选

n.times.map { rand(1..42) }

真的不需要内置的方法来实现这一目标;它并不常见,上面的内容非常清晰。

答案 1 :(得分:2)

Array#sample旨在根据文档选择唯一索引:

  

通过在数组中使用随机和唯一索引来选择元素,以确保元素不会重复,除非数组已包含重复元素。

所以你能做的最好,我认为分别挑选2个样本:

10.times.map { 2.times.map { array.sample } }
# => [[2, 4], [2, 2], [5, 2], [3, 3], [4, 5], [5, 5], [1, 2], [4, 4], [5, 3], [2, 5]]

答案 2 :(得分:1)

如果您想要重复的可能性,为什么不使用rand

10.times.map { [rand(1..5), rand(1..5)] }
# => [[3, 2], [5, 3], [4, 1], [5, 4], [4, 3], [4, 4], [5, 2], [1, 5], [1, 4], [3, 2]]

如果您希望选择是显式数组元素,请使用ary[rand(ary.length)]

答案 3 :(得分:0)

this_array = (1..5).to_a
def this_array.pick(n=1)
  return n.times.map{self.sample} unless block_given?
  n.times{ yield self.sample}
end

p this_array.pick(10)
this_array.pick(4){|num| p num}

注意pick仅针对this_array定义。