Aquí hay una implementación en C de Fisher-Yates que quiero usar en una rutina de barajado de barajas. ¿Estoy haciendo esto correctamente (n = longitud de la matriz)?¿Es correcta la implementación C de la compilación de Fisher-Yates?
Nota: El ciclo do-while intenta corregir el sesgo del módulo (consulte here). 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;
}
}
Me vino a la cabeza que 'int lim = RAND_MAX-i;' ... '} while (j> upper_bound && --lim);' podría ser una forma adecuada de atrapar el _it_ _can_ _never_ _happen_ caso de números aleatorios repetidos fuera de rango. – nategoose