Pour générer un tableau de nombres aléatoires dans une plage donnée en «C»

Je veux générer un tableau de nombres aléatoires, par exemple, si la plage est [0,10], puis la sortie souhaitée doit être 2 3 5 6 4 7 8 9 0 1 (non répétitive).

le problème auquel je suis confronté avec la fonction rand () est parfois que je reçois des répétitions de nos, j’étais des valeurs discrètes dans cette plage, et un ordre différent à chaque fois que j’appelle.

Ps: J’ai passé en revue certains des fils. Générer un double aléatoire dans une plage Générer des nombres aléatoires de manière uniforme sur toute une plage ici et ne pas pouvoir utiliser une mine similaire, il y a une différence subtile. surtout ce dernier est assez proche

Il semble plutôt un problème de mélange de celui de la randomisation.

Un bon début est le shuffle de Fisher-Yates qui commence avec le tableau d’éléments sortingés et génère une permutation aléatoire:

int size = 10; int *elements = malloc(sizeof(int)*size); // inizialize for (int i = 0; i < size; ++i) elements[i] = i; for (int i = size - 1; i > 0; --i) { // generate random index int w = rand()%i; // swap items int t = elements[i]; elements[i] = elements[w]; elements[w] = t; } 

Vous aurez plus de facilité si vous commencez avec un tableau contenant les entiers 0 à 9 (ou quelle que soit votre plage) et que vous le mélangiez ensuite de manière aléatoire. Il y a un exemple de la façon de faire le armsage ici .

Vous voudriez fondamentalement randomiser un tableau [0, 1, …, 9]. Voici un exemple C ++, devrait être facile à transformer en C:

Ce code ne concerne que les nombres entiers, mais j’espère que cela suffira. Je suis utilisé le GCC pour la compilation et seulement la bibliothèque standard C. Lire les commentaires pour plus de détails. Vos résultats auront des valeurs différentes, mais comme ce sera aléatoire.

 #include  #include  #include  #include  // http://man7.org/linux/man-pages/man3/errno.3.html #define ERROR_MIN_MORE_MAX_VALUE "Min value is more max value, returned 0" /* Returns a random integer in between min (inclusive) and max (inclusive) Returns 0 if min > max and to write a error message. */ static int random_integer(const int min, const int max) { if (max == min) return min; else if (min < max) return rand() % (max - min + 1) + min; // return 0 if min > max errno = EINVAL; perror(ERROR_MIN_MORE_MAX_VALUE); return 0; } /* Fills an array with random integer values in a range */ static int random_int_array(int array[], const size_t length, const int min, const int max){ for (int i = 0; i < length; ++i) { array[i] = random_integer(min, max); } return 0; } /* Print an array of integer items */ void print_int_array(int array[], size_t length) { char ending_charapter[] = ", "; putchar('['); for (size_t i = 0; i < length; ++i) { printf("%d", array[i]); if (i < length - 1) { printf("%s", ending_charapter); } } puts("]"); } int main (const int argc, const char *argv[]) { // for get a random integer number from a system, to pass a current time to the function srand srand(time(NULL)); int arr[10]; printf("\tAn array with random values from 0 to 100\n"); random_int_array(arr, 10, 0, 100); print_int_array(arr, 10); printf("\n\tAn array with random values from -100 to 0\n"); random_int_array(arr, 10, -100, 0); print_int_array(arr, 10); printf("\n\tAn array with random values from -100 to 100\n"); random_int_array(arr, 10, -100, 100); print_int_array(arr, 10); return 0; } 

Résultat

  An array with random values from 0 to 100 [86, 25, 98, 61, 42, 26, 87, 56, 86, 79] An array with random values from -100 to 0 [-33, -92, -57, -92, -6, -15, -61, -32, -75, -85] An array with random values from -100 to 100 [-15, -99, 54, 42, -74, 46, 6, -44, 86, -47] 

Environnement de test

 $ lsb_release -a No LSB modules are available. Dissortingbutor ID: Debian Description: Debian GNU/Linux 8.6 (jessie) Release: 8.6 Codename: jessie $ uname -a Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux $ gcc --version gcc (Debian 4.9.2-10) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

+ Mettez tous vos nombres dans le tableau de résultats
+ de N à 2
+ —- shuffle N éléments
+ retour tableau

Exemple

 fillarray(arr, 10); for (n = 10; n > 1; n++) shufflearray(arr, n); /* done */ 


Edit — Merci beaucoup de votants! Je n’avais même pas réalisé que je faisais trop de travail là-bas

  • Mettez tous vos nombres dans le tableau de résultats
  • du N au 2
  • —- échange élément N avec un élément aléatoire de 1 à N
  • retour tableau