C++ générateur de nombre aléatoire sans répéter les numéros de
J'ai cherché haut et bas pour un type de fonction qui transforme ce code
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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 pas de la répétition des nombres quelqu'un peut m'aider avec ça? après vérification j'ai l'intention de l'imprimer avec printf("%d\n", rand()%50);
J'ai juste besoin d'une routine qui permet de s'assurer de sa non-répétition. S'il vous plaît Si vous pouvez me donner une routine, je serais grandement soulagé et assurez-vous de payer avant.
Grâce. Les bibliothèques ne semble pas être en train de lire sur ce scren, mais ils sont stdio, stdlib et le temps et im en utilisant l'espace de noms.
- Modifier votre question: Sélectionnez votre code, puis appuyez sur la touche "101 010" bouton.
- Côté avis - Pourquoi
(unsigned)(NULL)
??? Ne 0 fonctionne pas pour vous? - Vous pouvez toujours stocker vos numéros générés au hasard dans une pile. Ensuite, vérifier pour voir si un nouveau rand est déjà dans la pile. Si oui, de générer un nouveau numéro, et vérifiez de nouveau.
- Que voulez-vous dire exactement par "non-répétition"? Avec précision finie, il n'y a qu'un nombre fini de nombres possibles qui peuvent être représentés. Voulez-vous dire une seule permutation aléatoire de N nombres (entiers)?
- Un ensemble serait probablement le faire bien, ne serait-il pas?
- C'EST JUSTE UN SHUFFLE, pour l'amour de dieu. Ce que vous cherchez est un "SHUFFLE". Bon sang!
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas simplement utiliser ce qui est déjà dans la STL? En regardant votre code d'exemple, et en supposant que c'est assez représentatif de ce que vous voulez faire, tout doit y être. (Je suppose que vous avez besoin d'un relativement petit de la gamme de nombres, de sorte que la mémoire ne serait pas une contrainte)
À l'aide de
std::random_shuffle
, et unstd::vector
contenant les entiers de la plage que vous souhaitez que vos numéros dans, devrait vous donner une séquence de nombres aléatoires que vous avez besoin de votre code d'exemple.Que vous aurez encore à appeler srand une fois, et une seule fois, avant d'utiliser
std::random_shuffle
. Pas plusieurs fois comme vous le faites dans votre exemple de code.Si votre gamme de nombres aléatoires est limitée et petite, disons que vous avez
X
des numéros différents.I
entre 0 etX
, et obtenez sa valeur deX
valeur dansI
positionVous devez seulement appeler
srand
une fois dans votre code, et vous devriez l'appeler avec un "hasard" de la graine commetime(NULL)
.En appelant
srand
dans la boucle, et de l'appeler avec un 0 de semences à chaque fois, vous aurez six numéros exactement la même.Cependant, même avec ces correctifs,
rand()%50
peut vous donner le même nombre à deux reprises. Ce que vous devrait être l'aide d'un algorithme de shuffle comme cette une depuis il fonctionne exactement de la même chose que les machines de loterie.Voici un programme complet en montrant que, dans l'action:
Exemple s'exécute:
Je vous conseille d'utiliser une meilleure génération de nombre aléatoire de l'algorithme qui peut offrir en interne, plutôt que d'utiliser rand.
Le problème avec
rand()
et en essayant d'éviter les répétitions, c'est que trouver un nombre inutilisé va ralentir avec chaque numéro est ajouté à la liste utilisée, pour devenir finalement un très long processus de recherche et de jeter les numéros.Si vous utilisez de plus en plus complexe générateur de nombres pseudo aléatoires (et il y a beaucoup, beaucoup de disponibles, vérifiez coup de pouce pour quelques-uns), vous aurez un temps plus facile et peut-être éviter les répétitions au total. Il dépend de l'algorithme, de sorte que vous aurez besoin de vérifier les documents.
De le faire sans l'aide des bibliothèques supplémentaires, vous pouvez pré-remplir un vecteur ou d'une liste séquentielle (ou même aléatoire) des nombres, chaque nombre est présent une fois dans la liste. Ensuite, pour générer un numéro de générer un nombre aléatoire et sélectionnez (et supprimer) cet élément de la liste. En enlevant chaque élément tel qu'il est utilisé, à condition que chaque élément était présent une fois pour commencer, vous ne serez jamais à court dans une copie.
Et si vous avez accès à C++0x, vous pouvez utiliser le nouveau générateur aléatoire des installations que l'emballage de tous de cette ordure pour vous!
http://www2.research.att.com/~bs/C++0xFAQ.html#std-aléatoire