Я пытаюсь создать «случайную» строку на основе фиксированной строки. Я хотел бы иметь возможность, если вообще возможно, создать ту же случайную строку (я знаю ее оксюморон), если я использую одно и то же семя. вот так:
$ base = '0123456789abcdef'; $ seed = 'qwe123'; функция get_seeded_random_string ($ base, $ seed) { ??? }
Ожидаемое поведение состояло бы в том, что пока я даю то же $base
и $seed
я всегда получаю одну и ту же случайную строку.
Извините, но в соответствии с документацией функция перетасовки автоматически загружается.
Как правило, вы не должны пытаться придумать свои собственные алгоритмы для рандомизации вещей, поскольку они, скорее всего, будут предвзятыми. Известно, что алгоритм Фишера-Йейса эффективен и беспристрастен:
function fisherYatesShuffle(&$items, $seed) { @mt_srand($seed); $items = array_values($items); for ($i = count($items) - 1; $i > 0; $i--) { $j = @mt_rand(0, $i); $tmp = $items[$i]; $items[$i] = $items[$j]; $items[$j] = $tmp; } }
Такая же функция для строки в php7
function fisherYatesShuffle(string &$items, int $seed) { @mt_srand($seed); for ($i = strlen($items) - 1; $i > 0; $i--) { $j = @mt_rand(0, $i); $tmp = $items[$i]; $items[$i] = $items[$j]; $items[$j] = $tmp; } }
Да, с mt_srand
вы можете указать семя для «лучшего» генератора случайных чисел mt_rand
.