重现随机数组排序

时间:2013-04-12 15:14:04

标签: ruby arrays random

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

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

2 个答案:

答案 0 :(得分:19)

如果您查看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生成多个可重复的混乱,以便通过使用一个{{1}来重复每个单独的混洗和重复的序列(而不是每次一个新的)并用相同的种子更新它重复:

Random

答案 1 :(得分:2)

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

如果是,您可以使用

设置种子
srand *seed number*

在运行脚本之前。我不是百分之百,但似乎有用,但我肯定会为它编写单元测试!