Как я могу заставить функцию shuffle php использовать семя, так что, когда я использую одно и то же семя, функция shuffle выведет тот же массив. Я читал, что тасовка автоматически посеяна. Есть ли способ получить семя этого тасования, или как я могу создать / имитировать тасование с помощью специального семени?
Вы не можете получить семя, используемое в случайном порядке, но вы можете имитировать тасование и исправить собственное семя:
$array = range(1, 10); function seededShuffle(array &$array, $seed) { mt_srand($seed); $size = count($array); for ($i = 0; $i < $size; ++$i) { list($chunk) = array_splice($array, mt_rand(0, $size-1), 1); array_push($array, $chunk); } } $seed = date('Ymd'); seededShuffle($array, $seed); var_dump($array);
Каждый день он будет устанавливать другое семя, но в течение дня он будет использовать одно и то же семя и перетасовать массив в том же порядке; завтра будет другая случайная перетасовка сегодня
На сегодняшний день (6 июня 2015 года) последовательность должна быть
3, 6, 9, 2, 7, 1, 8, 5, 10, 4
У PHP нет перетасовки с посевом, но вы можете сделать это вместо этого:
$an_array = array('a','b','c','d'); $indices = array(0,1,2,3); // shuffle the indices and use them as shuffling seed shuffle($indices); // then whenever you want to produce exactly same shuffle use the pre-computed shuffled indices function shuffle_precomputed($a, $shuffled_indices) { $b = $a; // copy array foreach ($shuffled_indices as $i1=>$i2) $a[$i2] = $b[$i1]; return $a; }
используйте следующее:
$shuffled_array = shuffle_precomputed($an_array, $indices);
Вы даже можете использовать систему факторических чисел, чтобы преобразовать массив $shuffled_indices
в / из уникального целочисленного числа, которое может использоваться как уникальное семя, а затем просто вычислить случайный случай из факториала, который будет использоваться в функции shuffle_precomputed
.
Для дополнительных вариантов shuffle
для PHP вы можете увидеть: