从 Ruby 中的 Array 中选取多个随机值,并且可以重复
Pick multiple random values from Array in Ruby with repetition possible
如何从数组中随机选取多个项目,以确保考虑元素的重复。 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
感谢您的宝贵时间!
Array#sample
旨在根据文档选择唯一索引:
The elements are chosen by using random and unique indices into the array in order to ensure that an element doesn’t repeat itself unless the array already contained duplicate elements.
所以你能做的最好的,在我看来是分别挑选 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]]
如果你想要重复的可能性,为什么不直接使用 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)]
要从一个数组中得到n
可能重复的随机元素,没有别的办法
n.times.map { ary.sample }
或者,如果您从一个范围内挑选
n.times.map { rand(1..42) }
确实不需要内置方法来实现这一点;这并不常见,而且上面的内容非常清晰。
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 定义。
如何从数组中随机选取多个项目,以确保考虑元素的重复。 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
感谢您的宝贵时间!
Array#sample
旨在根据文档选择唯一索引:
The elements are chosen by using random and unique indices into the array in order to ensure that an element doesn’t repeat itself unless the array already contained duplicate elements.
所以你能做的最好的,在我看来是分别挑选 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]]
如果你想要重复的可能性,为什么不直接使用 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)]
要从一个数组中得到n
可能重复的随机元素,没有别的办法
n.times.map { ary.sample }
或者,如果您从一个范围内挑选
n.times.map { rand(1..42) }
确实不需要内置方法来实现这一点;这并不常见,而且上面的内容非常清晰。
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 定义。