Generar números aleatorios “dentro del rango” en C

Necesito generar números aleatorios en el rango [0, 10] de manera que:

  • Todos los números se producen una vez.
  • No se logran resultados repetidos.

¿Alguien puede guiarme, por favor, sobre qué algoritmo usar?

El algoritmo en la respuesta de Richard J. Ross es incorrecto. Genera n^n posibles ordenamientos en lugar de n! . Esta publicación en el blog de Jeff Atwood ilustra el problema: http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html

En su lugar, debes usar el Shuffle de Knuth-Fisher-Yates:

 int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; srand(time(NULL)); for (int i = 10; i > 0; i--) { int n = rand() % (i + 1); int temp = values[n]; values[n] = values[i]; values[i] = temp; } 

Pruebe este algoritmo para números pseudoaleatorios:

 int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; srand(time(NULL)); for (int i = 0; i < 11; i++) { int swap1idx = rand() % 11; int swap2idx = rand() % 11; int tmp = values[swap1idx]; values[swap1idx] = values[swap2idx]; values[swap2idx] = tmp; } // now you can iterate through the shuffled values array. 

Tenga en cuenta que esto está sujeto a un sesgo de módulo, pero debería funcionar para lo que necesite.

Intenta crear una función aleatoria, como esta:

 void randomize(int v[], int size, int r_max) { int i,j,flag; v[0] = 0 + rand() % r_max; // start + rand() % end /* the following cycle manages, discarding it, the case in which a number who has previously been extracted, is re-extracted. */ for(i = 1; i < size; i++) { do { v[i]= 0 + rand() % r_max; for(j=0; j 

Luego, simplemente llámelo pasando una matriz v[] de 11 elementos, su tamaño y el rango superior:

 randomize(v, 11, 11); 

La matriz, debido al hecho de que se pasa como argumento por referencia, será aleatoria, sin repeticiones y con números que se producen una vez.

Recuerda llamar a srand(time(0)); antes de llamar al randomize , y para inicializar int v[11]={0,1,2,3,4,5,6,7,8,9,10};