【问题标题】:Reproduce random array sort重现随机数组排序
【发布时间】:2013-04-05 04:41:07
【问题描述】:

我有一个要随机排序的对象数组。对于这种情况,我可以使用array.shuffle。但是,如果我想稍后在同一个数组上重现该订单怎么办?有什么方法可以提供种子、随机数等,以便我以后可以重现这个序列?

我想从 MongoDB 数据库中生成一个随机的对象列表(使用 MongoID),并且该列表必须稍后重新生成。但据我所知,没有真正好的方法可以直接在 MongoDB 中实现随机排序。可能有很多对象 (>1,000,000),但计算时间是第一次尝试,而不是重要的事实。

【问题讨论】:

    标签: ruby arrays random


    【解决方案1】:

    如果您查看Ruby docs for Array#shuffle,您会发现您可以将Random 作为生成器传递;如果您每次使用相同的种子传递一个新的Random 来随机播放,它会给出相同的结果。

    >> arr = %w{John Paul George Ringo}
    => ["John", "Paul", "George", "Ringo"]
    >> arr.shuffle(random: Random.new(1))
    => ["Ringo", "John", "George", "Paul"]
    >> arr.shuffle(random: Random.new(1))
    => ["Ringo", "John", "George", "Paul"]
    >> arr.shuffle(random: Random.new(1))
    => ["Ringo", "John", "George", "Paul"]
    

    编辑:这可以扩展为让Array#shuffle 产生多个 可重复的洗牌,这样每个单独的洗牌和洗牌序列都可以重复,通过使用一个Random(而不是每次一个新的)并用相同的种子更新它以重复:

    >> arr = [1, 2, 3, 4] => [1, 2, 3, 4]
    >> r = Random.new(17) => #<Random:0x000000017be4d0>
    >> arr.shuffle(random: r) => [3, 1, 4, 2]
    >> arr.shuffle(random: r) => [1, 3, 2, 4]
    >> arr.shuffle(random: r) => [4, 3, 2, 1]
    >> r = Random.new(17) => #<Random:0x00000001c60da8>
    >> arr.shuffle(random: r) => [3, 1, 4, 2]
    >> arr.shuffle(random: r) => [1, 3, 2, 4]
    >> arr.shuffle(random: r) => [4, 3, 2, 1]
    >> etc.
    ?> 
    

    【讨论】:

    • 比我的解决方案好得多。使用这个。
    • 如果我使用Random.new(1)Random.new(23348594949),随机行为有什么不同吗?当然,这给出了不同的顺序,但是数字的大小重要吗?它必须是整数还是浮点数?
    • 这完全是一个不同的问题。简短的回答:种子的大小确实很重要,你可以传递一个浮点数,但它会截断它(所以3.14 给出与3 相同的结果)。
    • 在 1.8 上? (尽管乔·皮姆在那里做了一些工作:)
    • @rogerdpack 对于 1.8,我相信 Joe Pym 将是最好的解决方案。其他任何事情都会更复杂,并且基本上仍然是相同的事情(除非您想引入外部随机数库)。但是,我认为它不是线程安全的,但这不太可能成为问题。
    【解决方案2】:

    从方法的来源 (http://ruby-doc.org/core-2.0/Array.html#method-i-shuffle) 看,它看起来像是掉进了 Ruby 随机数生成器进行排序。

    如果是,你可以设置种子

    srand *seed number*
    

    在运行脚本之前。虽然我不是 100% 的,但它似乎有效,但我肯定会为它编写单元测试!

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多