Воспроизводить сортировку случайных массивов

У меня есть массив объектов, которые я хочу сортировать случайным образом. Для этого случая я могу использовать array.shuffle. Но что, если я хочу воспроизвести этот порядок позже в том же массиве? Есть ли способ, которым я могу предоставить семя, случайное число, что угодно, чтобы впоследствии воспроизвести эту последовательность?

Я хочу создать случайный список объектов из базы данных MongoDB (используя MongoID), и этот список необходимо воспроизвести позже. Но, насколько я знаю, нет действительно хорошего способа реализовать случайную сортировку непосредственно в MongoDB. Может быть много объектов ( > 1,000,000), но время вычисления для первой попытки не имеет значения.

Ответ 1

Если вы посмотрите на Ruby docs для 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.
?> 

Ответ 2

От взгляда на источник метода (http://ruby-doc.org/core-2.0/Array.html#method-i-shuffle), похоже, что он падает на генератор случайных чисел Ruby для сортировки.

Если это так, вы можете установить семя с помощью

srand *seed number*

перед запуском script. Я не на это 100%, но, похоже, это работает, но я бы, конечно, написал для него единичные тесты!