Как я могу рандомизировать массив в PHP, предоставив начальное значение и получить тот же порядок? - PullRequest
8 голосов
/ 03 июля 2010

Я пытаюсь создать «случайную» строку на основе фиксированной строки.Я хотел бы иметь возможность, если это вообще возможно, создать одну и ту же случайную строку (я знаю, что это оксюморон), при условии, что я использую то же семя.вот так:

    $base = '0123456789abcdef';
    $seed = 'qwe123';

    function get_seeded_random_string($base, $seed){
        ???
    }

Ожидаемое поведение будет таким, что, пока я даю одинаковые $base и $seed, я всегда получаю одну и ту же случайную строку.

Ответы [ 2 ]

11 голосов
/ 02 июля 2011

Извините, но в соответствии с документацией функция случайного выбора добавляется автоматически.

Обычно вы не должны пытаться придумать свои собственные алгоритмы для рандомизации вещей, так как они, скорее всего, будут предвзятыми. Известно, что алгоритм Фишера-Йейтса эффективен и беспристрастен:

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;
    }
}
2 голосов
/ 03 июля 2010

Да, с помощью mt_srand вы можете указать начальное число для «лучшего» генератора случайных чисел mt_rand.

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