Ecco una implementazione C di Fisher-Yates che voglio usare in una routine di mescolamento del mazzo. Sto facendo questo correttamente (n = lunghezza della matrice)?L'implementazione C di Fisher-Yates shuffle è corretta?
Nota: il ciclo do-while tenta di correggere il bias del modulo (vedere here). Aggiunge un po 'di overhead alla procedura e potrebbe essere eliminato se non ti interessa il bias a basso bit.
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;
}
}
Mi è appena venuto in mente che "int lim = RAND_MAX-i;' ... '} mentre (j> upper_bound && --lim);' potrebbe essere un modo adatto per catturare il caso _it_ _can_ _never_ _happen_ di numeri casuali ripetuti fuori intervallo. – nategoose