Cómo hacer un número de generación aleatorio entre 1 a 9 sin repetición

Busco sobre este tema en el sitio y uno de ellos me ayuda un poco. Quiero hacer un rompecabezas con un número aleatorio entre 1 a 9 y uso este método:

#include  #include  #include  int main() { int i = 1, num[9] = {1,2,3,4,5,6,7,8,9}, k = 1; srand(time(NULL)); for (i = 1; i < 10; i++) { num[i] = i; } for (i = 1; i < 10; i++) { int j = i + rand()%(10 - i); int temp = num[i]; num[i] = num[j]; num[j] = temp; if ((i - 1) % 3 == 0) { printf(" %i: ", k); k++; } printf(" %i", num[i]); if (i % 3 == 0) { printf("\n"); } } return 0; } 

pero tengo un problema con este code.it hace que los dos últimos números sean iguales !!! Alguien puede ayudarme ??

Puedes generar un rango único de números aleatorios como este. Funciona creando un grupo de todos los números disponibles, selecciona uno al azar y luego elimina ese número del grupo. El mismo método podría usarse para repartir un mazo de cartas, sin la necesidad de barajar explícitamente.

 #include  #include  #include  #define RANGE 9 // range of numbers int main() { int pool[RANGE]; int size, n; for (size=0; size 

Aquí también hay una versión depurada de su progtwig. Además de la mala indexación de la matriz, su error fue imprimir desde la matriz antes de que se completara la asignación aleatoria.

 #include  #include  #include  int main() { int i = 1, num[9] = {1,2,3,4,5,6,7,8,9}; srand((unsigned)time(NULL)); for (i=0; i<9; i++) { int j = rand() % 9; int temp = num[i]; num[i] = num[j]; num[j] = temp; } for (i=0; i<9; i++) { if (i % 3 == 0) printf("\n %d: ", 1+i/3); printf(" %i", num[i]); } printf("\n"); return 0; } 

La respuesta de @Weather Vane es eficiente en el tiempo, pero si necesita conservar la secuencia aleatoria, en lugar de simplemente generarla, necesitará una segunda matriz para copiar los datos. Lo siguiente baraja los datos “en el lugar”:

 #include  #include  void shuffle( int* pack, int length ) { int i ; // Initialise pack for( i = 0; i < length; i++ ) { pack[i] = i + 1 ; } // Swap random pairs for( i = 0; i < length; i++ ) { int n = rand() % length ; int m = rand() % length ; int h = pack[n] ; pack[n] = pack[m] ; pack[m] = h ; } } #define PACK_LENGTH 9 int main(void) { int i ; int pack[PACK_LENGTH] ; srand( time(0) ) ; // Create and shuffle the pack shuffle( pack, pack_length ) ; // Print the pack for( i = 0; i < pack_length; i++ ) { printf( "%d ", pack[i] ) ; } return 0; }