重现随机数组排序

23t*_*tux 10 ruby arrays random

我有一个对象数组,我想随机排序.对于这种情况,我可以使用array.shuffle.但是,如果我想稍后在同一阵列上重现该命令呢?有什么方法可以提供种子,随机数,等等,以便我可以在以后重现这个序列吗?

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

Rei*_*ard 19

如果你看一下Ruby文档,Array#shuffle你会看到你可以传递一个Random作为生成器; 如果你Random每次使用相同的种子传递一个新的shuffle,它将给出相同的结果.

>> 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"]
Run Code Online (Sandbox Code Playgroud)

编辑:这可以扩展到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.
?> 
Run Code Online (Sandbox Code Playgroud)