почему этот простой алгоритм случайного выбора дает смещенные результаты? какая простая причина?
кажется, что этот простой алгоритм случайного выбора будет давать смещенные результаты:
# suppose $arr is filled with 1 to 52
for ($i < 0; $i < 52; $i++) {
$j = rand(0, 51);
# swap the items
$tmp = $arr[j];
$arr[j] = $arr[i];
$arr[i] = $tmp;
}
Вы можете попробовать это ... вместо 52, использовать 3 (предположим, что используются только 3 карты), и запустить его 10000 раз и подсчитать результаты, вы увидите, что результаты искажены к определенным шаблонам ...
вопрос ... каково простое объяснение того, что это произойдет?
правильное решение состоит в том, чтобы использовать что-то вроде
for ($i < 0; $i < 51; $i++) { # last card need not swap
$j = rand($i, 51); # don't touch the cards that already "settled"
# swap the items
$tmp = $arr[j];
$arr[j] = $arr[i];
$arr[i] = $tmp;
}
но вопрос в том, почему первый метод, казалось бы, также совершенно случайный, сделает результаты смещенными?
Обновление 1: спасибо за людей, указывающих на то, что он должен быть rand ($ i, 51) для правильного перемешивания.