Кто-нибудь знает, что такое случайность функции 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, он всегда возвращал случайный массив в том же порядке. Если это кому-то поможет, я буду счастлив!