如何从数组中随机选择多个项目,我可以确保重复元素。 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
谢谢你的时间!
答案 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定义。