Ну вот решение, которое я придумал:
function randomize_array_1($array_to_randomize) {
$new_array = array();
while (count($array_to_randomize) > 0) {
$rand_num = rand(0, count($array_to_randomize)-1);
$extracted = array_splice($array_to_randomize, $rand_num, 1);
$new_array[] = $extracted[0];
}
return $new_array;
}
И вот его решение:
function randomize_array_2($array_to_randomize) {
usort($array_to_randomize, "rand_sort");
return $array_to_randomize;
}
function rand_sort($a, $b) {
return rand(-1, 1);
}
Я провел несколько испытаний по обоим методам (пытаясь каждый раз по 1000000 раз), и разница в скорости была незначительной. Однако, проверив фактическую случайность результатов, я был удивлен тем, насколько различными были распределения. Вот мои результаты:
randomize_array_1:
[2, 3, 1] => 166855
[2, 1, 3] => 166692
[1, 2, 3] => 166690
[3, 1, 2] => 166396
[3, 2, 1] => 166629
[1, 3, 2] => 166738
randomize_array_2:
[1, 3, 2] => 147781
[3, 1, 2] => 73972
[3, 2, 1] => 445004
[1, 2, 3] => 259406
[2, 3, 1] => 49222
[2, 1, 3] => 24615
Как видите, первый метод обеспечивает почти идеальное распределение, что указывает на то, что он более или менее действительно случайный, тогда как второй метод повсеместно.