¿Es correcta esta implementación de C de Fisher-Yates shuffle?
Aquí hay una implementación en C de Fisher-Yates que quiero usar en una rutina de barajar baraja. ¿Estoy haciendo esto correctamente (n = longitud de la matriz)?
Nota: El ciclo do-while intenta corregir el sesgo del módulo (veraquí) Agrega un poco de sobrecarga al procedimiento y podría eliminarse si no le importa el sesgo de bits bajos.
void shuffle(int *array, int n) {
int i, j, tmp, upper_bound;
srand(time(NULL));
for (i = n - 1; i > 0; i--) {
upper_bound = RAND_MAX - ((RAND_MAX % (i + 1)) + 1);
do {
j = rand() % (i + 1);
} while (j > upper_bound);
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}