почему этот простой алгоритм случайного выбора дает смещенные результаты? какая простая причина?

кажется, что этот простой алгоритм случайного выбора будет давать смещенные результаты:

# 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) для правильного перемешивания.

Ответы на вопрос(12)

Ваш ответ на вопрос