在Ruby中从Array中选择多个随机值,并允许重复

nzrxty8p  于 2023-01-25  发布在  Ruby
关注(0)|答案(5)|浏览(143)

我如何从数组中随机选取多个项目,其中我可以确保元素的重复被考虑。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

谢谢你的时间!

u3r8eeie

u3r8eeie1#

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

n.times.map { ary.sample }

或者如果你从一系列

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

真的不需要一个内置的方法来实现这一点;这并不常见,上面的文字非常清晰。

vx6bjr1n

vx6bjr1n2#

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]]
soat7uwm

soat7uwm3#

如果希望有重复的可能性,为什么不使用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)]

vm0i2vca

vm0i2vca4#

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定义。

3hvapo4f

3hvapo4f5#

array = (1..5).to_a

rand(1..array.size).times.map { array.sample }

可能的结果,例如

[1]
[1, 1]
[2, 3, 4]
[1, 4, 2, 5]
[5, 5, 5, 5, 5]

相关问题