Возьмите эту функцию, которая представляет собой посевной 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]]; } }
Просто сгенерируйте одну и ту же последовательность случайных чисел, используя известное семя, и переверните ее в обратном порядке.