Randomize 4 nombres différents

J’essaie de randomiser 4 nombres différents en C et d’essayer le code suivant:

{ int num1 = 0, num2 = 0, num3 = 0, num4 = 0; int i = 0; while (num1 == num2 && num1 == num3 && num1 == num4 && num2 == num3 && num2 == num4 && num3 == num4 && num3 == num2) { num1 = rand() % 7; num2 = rand() % 7; num3 = rand() % 7; num4 = rand() % 7; } printf("%d %d %d %d\n", num1, num2, num3, num4); } 

Le code suppose de vérifier si les nombres ne sont pas égaux et s’ils le sont, il doit générer de nouveaux nombres jusqu’à ce qu’ils soient tous distincts. Mais pour une raison quelconque, cela ne fonctionne pas bien et même les bons nombres les mettent comme faux et cela devient une boucle sans fin.

Qu’est-ce que je rate?

Ce code choisira 4 nombres différents dans la plage 0 .. 6, il fonctionne en créant un tableau de nombres disponibles. Chaque fois qu’il est sélectionné, il est supprimé de la liste.

 #include  #include  #include  #define RANGE 7 // how many different numbers #define PICK 4 // how many to pick int main(void) { int pool[RANGE]; int size, n, i; for (size=0; size 

Essayez comme ça

 void get_random_values(int *values) { int source[] = {0, 1, 2, 3, 4, 5, 6}; for (int i = 0 ; i < 7 ; ++i) { int saved; int j = rand() % 7; int k = rand() % 7; saved = source[j]; source[j] = source[k]; source[k] = saved; } values[0] = source[0]; values[1] = source[1]; values[2] = source[2]; values[3] = source[3]; } int main(void) { int values[4]; srand(time(NULL)); get_random_values(values); for (int i = 0 ; i < 4 ; ++i) fprintf(stderr, "%d ", values[i]); fprintf(stderr, "\n"); return 0; } 

N'oubliez pas de définir la valeur aléatoire srand() au démarrage du programme ou vous obtiendrez toujours la même séquence.

Pour obtenir une séquence aléatoire et impartiale :

 #include  #include  #define N 7 int main(int argc, char **argv) { // seed random number generator with first argument for easier testing if (argc > 1) { srand(atoi(argv[1])); } int array[N] = {0,1,2,3,4,5,6}; // Fisher–Yates shuffle: // https://en.wikipedia.org/w/index.php?oldid=697311634#The_modern_algorithm for (unsigned i = 0; i < N - 1; ++i) { unsigned modulo = N - i; // unbiased rand() % modulo: // https://stackoverflow.com/a/10989061/416224 unsigned j; do { j = rand(); } while (j >= RAND_MAX - (RAND_MAX % modulo)); j %= modulo; if (j > 0) { int tmp = array[i]; array[i] = array[i + j]; array[i + j] = tmp; } } for (unsigned i = 0; i < N; ++i) { printf("%u. %d\n", i + 1, array[i]); } return 0; } 

Veuillez suivre les liens référencés dans le code.

Je suggérerais une solution universelle:

  • tableau de toute taille

  • limites inférieure et supérieure envoyées en tant que parameters.

     #include  #include  #include  void random(int* values, int amount, int lower_bound, int upper_bound) { int i=0, j=0, temp; if(amount > upper_bound - lower_bound + 1) return; // if there are more numbers than given bound for(i=0; i=0; --j) if(temp==values[j]) break; if(temp==values[j]) continue; values[i]=temp; ++i; } } int main() { srand(time(NULL)); int arr[4]={0,0,0,0}; random(arr, 4, 5, 10); for(int i=0; i<4; ++i) printf("%d\n", arr[i]); } 

Avec cela, vous pouvez avoir (par exemple) 10 nombres de valeurs originales de -6 à 7.