11

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

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

4

2 回答 2

20

如果您查看Ruby 文档,Array#shuffle您会发现您可以将 aRandom作为生成器传递;如果您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.
?> 
于 2013-04-12T15:20:48.853 回答
2

通过查看方法的来源(http://ruby-doc.org/core-2.0/Array.html#method-i-shuffle),看起来它正在放入 Ruby 随机数生成器进行排序。

如果是,您可以设置种子

srand *seed number*

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

于 2013-04-12T15:18:04.940 回答