¿Cómo crear una permutación aleatoria de una matriz?

He escrito esta función en C y quiero que cree una permutación aleatoria o una lista de números del 1 al n. Estoy teniendo problemas para que no tenga números repetidos. Entonces, si tiene n = 4, me gustaría que devuelva una matriz aleatoria que contenga 1-4 cada una solo una vez, por ejemplo: {1,3,4,2}

int* random(int n) { int* r = malloc(n * sizeof(int)); // initial range of numbers for(int i=0;i<n;++i){ r[i]=i+1; } // shuffle for (int i = 1; i <= n; ++i){ int j = rand() % i; r[i] = r[j]; r[j] = i; } return r; } 

Cambia tu segundo bucle por:

 for (int i = n-1; i >= 0; --i){ //generate a random number [0, n-1] int j = rand() % (i+1); //swap the last element with element at random index int temp = r[i]; r[i] = r[j]; r[j] = temp; } 

Este es un algoritmo de barajado de Fisher-Yates. He oído que el uso de rand() % n no se distribuye uniformemente, se le ha advertido.

Y si desea generar permutaciones únicas cada vez, puede almacenar las permutaciones generadas, tal vez en un Dictionary o Hashmap , y luego buscar cada vez que regrese. No creo que C tenga uno incorporado, pero debería haber bibliotecas disponibles.

Puede que no sea la forma más eficiente, pero como ya está poblando la matriz al principio, puede simplemente recorrer los elementos y, para cada uno, seleccionar un índice aleatorio en el rango de 1 a n, e intercambiar con ese artículo:

 int* random(int n) { int* r = malloc(n * sizeof(int)); for(int i=0;i 

No sé si esto es lo más eficiente o incluso si da la mejor distribución. Pero es bastante simple 🙂