¿por qué este simple algoritmo aleatorio produce resultados sesgados? ¿Cuál es una razón simple?

parece que este simple algoritmo aleatorio producirá resultados sesgados:

# 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;
}

puedes probarlo ... en lugar de usar 52, usa 3 (supongamos que solo se usan 3 cartas), y ejecútalo 10,000 veces y suma los resultados, verás que los resultados están sesgados hacia ciertos patrones ...

la pregunta es ... ¿cuál es una explicación simple de que sucederá?

la solución correcta es usar algo como

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;
}

pero la pregunta es ... ¿por qué el primer método, aparentemente también totalmente aleatorio, hará que los resultados sean sesgados?

Actualización 1: gracias por la gente que señala que necesita ser rand ($ i, 51) para que se mezcle correctamente.

Respuestas a la pregunta(24)

Su respuesta a la pregunta