Можно ли перетасовать семена?

Возьмите эту функцию, которая представляет собой посевной Fisher-Yates shuffle (порядок случайный, но воспроизводимый с учетом того же семени):

function seeded_shuffle(array &$items, $seed = false) { $items = array_values($items); mt_srand($seed ? $seed : time()); for ($i = count($items) - 1; $i > 0; $i--) { $j = mt_rand(0, $i); list($items[$i], $items[$j]) = array($items[$j], $items[$i]); } } 

Можно ли изменить этот алгоритм? Т.е., учитывая начальное значение и перетасованный массив, может ли массив «размяться» в исходном порядке? Если да, то как?

(Этот вопрос возник в комментариях здесь .)

Оказывается, ответ да, и довольно простой:

 function seeded_unshuffle(array &$items, $seed) { $items = array_values($items); mt_srand($seed); $indices = []; for ($i = count($items) - 1; $i > 0; $i--) { $indices[$i] = mt_rand(0, $i); } foreach (array_reverse($indices, true) as $i => $j) { list($items[$i], $items[$j]) = [$items[$j], $items[$i]]; } } 

Просто сгенерируйте одну и ту же последовательность случайных чисел, используя известное семя, и переверните ее в обратном порядке.