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