【问题标题】:Pick multiple random values from Array in Ruby with repetition possible从 Ruby 中的 Array 中选择多个随机值,并可能重复
【发布时间】:2015-01-11 15:22:35
【问题描述】:

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

感谢您的宝贵时间!

【问题讨论】:

  • 不确定是什么问题。是否要重复值?
  • 不清楚?我想确保我的随机选择可以也有重复值。
  • 为什么不打乱数组并从头开始挑选元素?
  • 你可以把它写成rv(array,n).zip(rv(array,n)),其中rv(array,n)array返回一个由n元素组成的随机数组。
  • my_array.shuffle[0..10]

标签: ruby arrays


【解决方案1】:

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】:

    如果您想要重复的可能性,为什么不直接使用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】:

      要从数组中获取n 可能重复的随机元素,别无他法

      n.times.map { ary.sample }
      

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

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

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

      【讨论】:

      • 我更喜欢Array.new(n) { ary.sample },因为它的读法是:“创建一个由n 元素组成的数组,每个元素都是ary 的随机选择的元素”。
      • 也许我非常确信我错过了一些东西。无论如何感谢您确认这种方法不存在。
      【解决方案4】:
      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 定义。

      【讨论】:

      • 修补对象并不是我们在主流 ruby​​ 中经常看到的。不过,记住我们可以做到这一点是件好事。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      相关资源
      最近更新 更多