Mezcla una matriz de int en C con – sin bucle while

Quiero barajar una matriz de entradas, la matriz está ordenada y su tamaño en n, los valores son 1 – n. Solo quiero evitar usar un bucle while para asegurarme de que rand () no me da el mismo índice. El código parece algo así:

void shuffleArr(int* arr, size_t n) { int newIndx = 0; int i = 0; for(; i < n - 1; ++i) { while((newIndx = i + rand() % (n - i)) == i); swap(i, newIndx, arr); } } 

El bucle for va hasta n-1, por lo que, por ejemplo, en la última ejecución tiene 50/50 de probabilidad de ser igual a i. Quiero evitar esta idea.

Si está buscando un número aleatorio en el rango 1 … n pero excluyendo algún número m en ese rango, puede obtener un número aleatorio en el rango 1 … (n-1) y para cualquier resultado> = m agregar 1 al valor.

Si está buscando una explicación de un algoritmo para barajar una lista finita, eche un vistazo a Fisher-Yates aquí: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

Aquí está la solución, involucra un poco de ambos.

 void Shuffle(int[] arr, size_t n) { int newIndx = 0; int i = 0; for(; i < n - 2; ++i) { newIndx = i + rand() % (n - i); if(newIndx == i) { ++newIndx; } swap(i, newIndx, arr); } } 

No es necesario realizar un bucle hasta que haya una buena (número aleatorio! = I), porque se corrige con el incremento if + de newIndx.