Подтвердить что ты не робот

Насколько случайна функция PHP shuffle?

Кто-нибудь знает, что такое случайность функции PHP shuffle()? Это зависит от операционной системы? Использует ли он собственную сеялку PHP?

Можно ли использовать mt_rand() в качестве генератора?

4b9b3361

Ответ 1

Функция

shuffle() основана на том же генераторе, что и rand(), который является системным генератором на основе линейного конгруэнтного алгоритма. Это быстрый генератор, но с большей или меньшей случайностью. Начиная с PHP 4.2.0, случайный генератор высевается автоматически, но вы можете использовать функцию srand(), чтобы засеять его, если хотите.

mtrand() основан на алгоритме Mersenne Twister, который является одним из лучших доступных псевдослучайных алгоритмов. Чтобы перетасовать массив с помощью этого генератора, вам нужно написать собственную функцию тасования. Вы можете посмотреть, например, в алгоритм Фишера-Йейса. Написание вашей собственной функции перетасовки приведет к лучшей случайности, но будет медленнее, чем встроенная функция тасования.

Ответ 2

На основе ответа Mirouf (большое вам спасибо за ваш вклад)... Я немного уточнил, чтобы вывести избыточный подсчет массивов. Я также назвал переменные несколько иначе для моего собственного понимания.

Если вы хотите использовать это точно так же, как и shuffle(), вы можете изменить параметр, который будет передаваться по ссылке, т.е. массив $am, а затем убедитесь, что вы просто изменили возврат: "return;" и назначить полученный случайный массив обратно массиву $как таковой: $ array = $randArr; (Перед возвратом).

function mt_shuffle($array) {
    $randArr = [];
    $arrLength = count($array);

    // while my array is not empty I select a random position
    while (count($array)) {
        //mt_rand returns a random number between two values
        $randPos = mt_rand(0, --$arrLength);
        $randArr[] = $array[$randPos];

        /* If number of remaining elements in the array is the same as the
         * random position, take out the item in that position,
         * else use the negative offset.
         * This will prevent array_splice removing the last item.
         */
        array_splice($array, $randPos, ($randPos == $arrLength ? 1 : $randPos - $arrLength));
    }

    return $randArr;
}

Ответ 3

Он случайный, как rand();

И как стиль PHP вам не нужно семенить

Ответ 4

Обновление для PHP 7.1

Так как для PHP 7.1 был реализован rng_fixes rfc, теперь реализация shuffle использует Merrenne Twister PRNG (т.е. использует mt_rand и зависит от вызова mt_srand).

Устаревшая система PRNG (rand) больше недоступна; функции rand и srand на самом деле схожи с их эквивалентами mt_.

Ответ 5

mt_rand()

Генерирует случайное число.

shuffle()

Ранжирует массив. Он также генерирует новые ключи в массиве, а не просто переставляет старые.

Если вы хотите посеять PHP, вы бы использовали mt_strand().

Однако, поскольку загрузка PHP 4.2.0 выполняется автоматически в PHP при вызове mt_rand.

Ответ 6

Работает с ассоциативными и числовыми массивами:

function mt_shuffle_array($array) {
    $shuffled_array = [];
    $arr_length = count($array);

    if($arr_length < 2) {
        return $array;
    }

    while($arr_length) {
        --$arr_length;
        $rand_key = array_keys($array)[mt_rand(0, $arr_length)];

        $shuffled_array[$rand_key] = $array[$rand_key];
        unset($array[$rand_key]);
    }

    return $shuffled_array;
}

$array = [-2, -1, 'a' => '1', 'b' => '2', 'c' => '3', 11, 'd' => '4', 22];
$shuffled_array = mt_shuffle_array($array);

введите описание изображения здесь

Ответ 7

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

/**
 * Build a random array
 *
 * @param mixed $array
 *
 * @return array
 */
function random_array($array) {
    $random_array = array();
    // array start by index 0
    $countArray = count($array) - 1;

    // while my array is not empty I build a random value
    while (count($array) != 0) {
        //mt_rand return a random number between two value 
        $randomValue = mt_rand(0, $countArray);
        $random_array[] = $array[$randomValue];

        // If my count of my tab is 4 and mt_rand give me the last element, 
        // array_splice will not unset the last item
        if(($randomValue + 1) == count($array)) {
            array_splice($array, $randomValue, ($randomValue - $countArray + 1));
        } else {
            array_splice($array, $randomValue, ($randomValue - $countArray));
        }

        $countArray--;
    }

    return $random_array;
}

Это не лучший способ сделать это, но когда я использовал функцию shuffle, он всегда возвращал случайный массив в том же порядке. Если это кому-то поможет, я буду счастлив!