重现随机数组排序

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

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

如果你查看Array#shuffle的Ruby文档,你会发现你可以传递一个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) => # >> 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) => # >> 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. ?> 

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

如果是,您可以设置种子

 srand *seed number* 

在运行脚本之前。 我不是百分之百,但它似乎有效,但我肯定会为它编写unit testing!