Estoy tratando de entender un aspecto de una mezcla segura con Fisher-Yates. Para referencia, aquí está Fisher-Yates para mezclar una matriz x de n elementos (numerados de 0 a n-1) (de Asegurando un algoritmo aleatorio ):
for all i from 0 to n-1
let j = rnd(n - i) + i
swap x[i] with x[j]
No entiendo muy bien a qué se dedica Tom Leeks en su explicación de la función rnd
en Asegurando un Shuffle Algoritmo :
rnd(k):
while true
let z = next-random-word
let r = z mod k
if z - r + k <= 2^32
return r
¿Por qué no se puede usar directamente r
y por qué se necesita el if z - r + k <= 2^32
?
Creo que mi problema es que no aprecio en comprender el sesgo en la reducción.