Générateur de nombres aléatoires C ++ sans répétition de nombres

J’ai cherché haut et bas pour un type de fonction qui transforme ce code

#include  #include  #include  #include  using namespace std; void ran(int array[], int max); int main() { printf("Today's lottery numbers are:\n"); for (int i = 0; i < 6; i++) srand((unsigned)(NULL)); } 

dans un générateur de nombre aléatoire qui assure qu’aucun nombre répétitif ne peut m’aider avec? après le contrôle, je prévois de l’imprimer avec printf("%d\n", rand()%50);

J’ai juste besoin d’une routine qui s’assure qu’elle ne se répète pas. S’il vous plaît, si vous pouvez me donner une routine, je serais grandement soulagé et je ne manquerai pas de la payer.

Merci. Les bibliothèques ne semblent pas lire directement sur cet écran mais elles utilisent stdio, stdlib et time and im en utilisant un espace de noms.

Pourquoi ne pas simplement utiliser ce qui est déjà dans la STL? En regardant votre exemple de code, et en supposant qu’il soit un peu représentatif de ce que vous voulez faire, tout devrait être dedans. (Je suppose que vous avez besoin d’une plage de chiffres relativement petite, afin que la mémoire ne soit pas une contrainte)

Utiliser std::random_shuffle et un std::vector contenant les entiers dans la plage dans laquelle vous souhaitez std::random_shuffle vos nombres devrait vous donner une séquence de nombres aléatoires uniques dont vous avez besoin dans votre exemple de code.

Vous devrez toujours appeler srand une fois et une fois seulement avant d’utiliser std::random_shuffle . Pas plusieurs fois comme vous le faites dans votre exemple de code actuel.

Si votre gamme de nombres aléatoires est finie et petite, supposons que vous avez X nombres différents.

  • Créer un tableau avec chaque numéro
  • Sélectionnez un indice aléatoire I compris entre 0 et X et obtenez sa valeur
  • Déplacer la valeur X dans la position I
  • Diminuer X et répéter

Vous ne devez appeler srand qu’une seule fois dans votre code et vous devez l’appeler avec une valeur de départ “aléatoire” telle que le time(NULL) .

En appelant srand dans la boucle et en l’appelant avec une valeur de départ 0 à chaque fois, vous obtiendrez exactement six chiffres identiques.

Cependant, même avec ces correctifs, rand()%50 peut vous donner le même nombre deux fois. Ce que vous devriez utiliser est un algorithme de lecture aléatoire comme celui-ci, car il fonctionne exactement comme les machines de loterie.

Voici un programme complet montrant que dans l’action:

 #include  #include  #include  static void getSix (int *dst) { int sz, pos, i, src[50]; for (i = 0; i < sizeof(src)/sizeof(*src); i++) src[i] = i + 1; sz = 50; for (i = 0; i < 6; i++) { pos = rand() % sz; dst[i] = src[pos]; src[pos] = src[sz-1]; sz--; } } int main (void) { srand (time (NULL)); int i, numbers[6]; getSix (numbers); printf ("Numbers are:\n"); for (i = 0; i < sizeof(numbers)/sizeof(*numbers); i++) printf (" %d\n", numbers[i]); return 0; } 

Échantillons:

 Numbers are: 25 10 26 4 18 1 Numbers are: 39 45 8 18 17 22 Numbers are: 8 6 49 21 40 28 Numbers are: 37 49 45 43 6 40 

Je recommanderais d’utiliser un meilleur algorithme de génération de nombres aléatoires pouvant offrir cela en interne, plutôt que d’utiliser rand.

Le problème avec rand() et d’essayer d’éviter les répétitions est que la recherche d’un numéro inutilisé ralentit avec chaque nombre ajouté à la liste utilisée, devenant finalement un très long processus de recherche et de suppression de numéros.

Si vous utilisiez un générateur de nombres pseudo-aléatoires plus complexe (et qu’il y en a beaucoup, vérifiez Boost pour quelques-uns), vous aurez plus de facilité et pourrez peut-être éviter les répétitions. Cela dépend de l’algorithme, il vous faudra donc consulter la documentation.

Pour le faire sans utiliser de bibliothèques supplémentaires, vous pouvez pré-remplir un vecteur ou une liste avec des nombres séquentiels (voire aléatoires), en vous assurant que chaque numéro est présent une fois dans la liste. Ensuite, pour générer un nombre, générez un nombre aléatoire et sélectionnez (et supprimez) cet élément de la liste. En supprimant chaque élément tel qu’il est utilisé, tant que chaque élément était présent une fois pour commencer, vous ne rencontrez jamais de doublon.

Et si vous avez access à C ++ 0x, vous pouvez utiliser les nouvelles installations de générateur aléatoire qui encapsulent toute cette ordure pour vous!

http://www2.research.att.com/~bs/C++0xFAQ.html#std-random