Ответ 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.
?>