Générer des nombres aléatoires «à l’intérieur» en C

J’ai besoin de générer des nombres aléatoires dans l’intervalle [0, 10] tels que:

  • Tous les nombres apparaissent une fois.
  • Aucun résultat répété n’est atteint.

Quelqu’un peut-il me guider sur quel algorithme utiliser?

L’algorithme dans la réponse de Richard J. Ross est incorrect. Il génère n^n ordres possibles au lieu de n! . Cet article sur le blog de Jeff Atwood illustre le problème: http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html

Au lieu de cela, vous devriez utiliser le shuthle 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; } 

Essayez cet algorithme pour les nombres pseudo-aléatoires:

 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. 

Notez que ceci est sujet à un biais modulo, mais cela devrait fonctionner pour ce dont vous avez besoin.

Essayez de créer une fonction aléatoire, comme ceci:

 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 

Ensuite, appelez-le simplement en passant un tableau v[] de 11 éléments, sa taille et la plage supérieure:

 randomize(v, 11, 11); 

Le tableau, en raison du fait qu’il est passé argument par référence, sera randomisé, sans répétition et les nombres apparaissent une fois.

N'oubliez pas d'appeler srand(time(0)); avant d'appeler le randomize et d'initialiser int v[11]={0,1,2,3,4,5,6,7,8,9,10};