Кто-нибудь знает, что такое случайность функции shuffle()
PHP? Это зависит от операционной системы? Использует ли он собственную сеялку PHP?
Можно ли использовать mt_rand()
качестве генератора?
Функция shuffle()
основана на том же генераторе, что и rand()
, который является системным генератором на основе линейного конгруэнтного алгоритма . Это быстрый генератор, но с большей или меньшей случайностью. Начиная с PHP 4.2.0, случайный генератор высевается автоматически, но вы можете использовать srand()
чтобы засеять ее, если хотите.
mtrand()
основан на алгоритме mtrand()
Твистера , который является одним из лучших псевдослучайных алгоритмов. Чтобы перетасовать массив с помощью этого генератора, вам нужно написать собственную функцию тасования. Вы можете искать пример по алгоритму Фишера-Йейтса . Написание вашей собственной функции перетасовки приведет к лучшей случайности, но будет медленнее, чем встроенная функция тасования.
Основываясь на ответе Мироуфа (спасибо вам большое за ваш вклад) … Я немного уточнил, чтобы вывести избыточный подсчет массивов. Я также назвал переменные несколько иначе для моего собственного понимания.
Если вы хотите использовать это точно так же, как shuffle (), вы можете изменить параметр, который должен быть передан по ссылке, т. Е. & $ Array, а затем убедитесь, что вы просто изменили возврат: «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; }
Это случайное, как rand()
;
И как стиль PHP вам не нужно семя
Поскольку rng_fixes rfc был реализован для PHP 7.1, реализация shuffle
теперь использует Merrenne Twister PRNG (т. mt_srand
Использует mt_rand
и затрагивается вызовом mt_srand
).
Унаследованная система PRNG ( rand
) больше недоступна; функции rand
и srand
фактически mt_
с их mt_
эквивалентами.
mt_rand()
Производит случайное число.
shuffle()
Рандомизирует массив. Он также генерирует новые ключи в массиве, а не просто перестраивает старые.
Если вы хотите посеять PHP, вы бы использовали mt_strand()
.
Однако, поскольку PHP 4.2.0 посев выполняется автоматически в PHP, когда вы вызываете mt_rand.
Работает с ассоциативными и числовыми массивами:
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);
с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);
Я создал функцию, которая сортирует мой массив случайным образом.
/** * 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, он всегда возвращал случайный массив в том же порядке. Если это кому-то поможет, я буду счастлив!