Comment générer des nombres aléatoires dans une boucle en C++?
Est-il possible de générer un nombre aléatoire différent, à chaque fois que la boucle s'exécute. Par exemple, j'ai:
for (int t=0;t<10;t++)
{
int random_x;
srand ( time(NULL) );
random_x = rand() % 100;
cout<<"\nRandom X = "<<random_x;
}
Mais le problème est, il génère même nombre aléatoire à chaque fois. Est-il possible de générer des nombres aléatoires à chaque fois que la boucle s'exécute?
EST-il possible de réinitialiser le nombre aléatoire initiallization ainsi?
- La lecture de la documentation pour
srand()
pourrait être utile. - Juste pour faire de Noé commentaire un peu plus utile: cplusplus.com/reference/clibrary/cstdlib/srand 🙂
- double possible de Toujours répété les chiffres donnés par rand()
- +1 pour le "même nombre aléatoire à chaque fois" (lol!)
- Enlevé le
[c]
tag, depuis que la question a "C++" dans le titre.
Vous devez vous connecter pour publier un commentaire.
Ne pas utiliser
srand
l'intérieur de la boucle, utiliser qu'une seule fois, par exemple, au début demain()
. Etsrand()
est exactement la façon dont vous le réinitialiser.Vous obtenez le même nombre aléatoire à chaque fois, parce que vous êtes à la définition d'une graine à l'intérieur de la boucle. Même si vous utilisez
time()
, elle change seulement une fois par seconde, donc si votre boucle est terminée dans une deuxième (qu'il en sera probablement de même), vous obtiendrez la même valeur de départ à chaque fois, et le même nombre aléatoire.Déplacer le
srand()
appeler à l'extérieur de la boucle (et de l'appeler qu'une seule fois, au début de votre application) et vous devriez obtenir aléatoire "random" des chiffres.srand()
est très cher par rapport àrand()
. Dans la glibc, cela est garanti par le fait que, en plus de la configuration initiale effectuée parsrand()
il appellerand()
300+ temps de remuer le pot.% 100
et de regarder les premières valeurs retournées parrand
. À l'aide de la%
opérateur de la carte dans une plage de valeurs peut entraîner une non-distribution normale selon le RNG être utilisés comme bits de mai pas être tout à fait aléatoire. Une meilleure méthode est de faire quelque chose commeval = min + (int) ((double) rand() / RAND_MAX * (max - min + 1);
à la carte dans l'intervalle [min,max].Ne pas utilisation
rand()
; utiliser de nouvelles C++11 installations (par exemple,std::mt19937
,std::uniform_int_distribution
, etc.) au lieu de cela.Vous pouvez utiliser le code comme ceci (live ici sur Ideone):
P. S.
Envisager de regarder cette vidéo de Natifs de 2013 de la conférence pour plus de détails sur
rand()
problèmes liés à l':Essayez de déplacer la graine
srand
en dehors de la boucle comme ceci:Comme Marque de Rançon est dit dans le commentaire, le déplacement de la graine à l'extérieur de la boucle ne vous aidera que si la boucle ne réside pas dans une fonction que vous appelez plusieurs fois.
J'ai eu ce même problème pendant des jours. En gardant srand() de la boucle est un +. Aussi, ne pas affecter rand() % 100 à n'importe quelle variable. Simplement cout rand() % 100 dans la boucle. Essayez ceci:
Arrêter l'amorçage de la génératrice à chaque fois.
Tirez le srand appel de la boucle
Déplacer le
srand
appel au début du programme. Comme vous l'avez maintenant, le temps peut être le même entre les deux appels consécutifs, de sorte que le générateur de nombre aléatoire sera de nouveau au même endroit.Vous devez extraire l'initilization de temps() de la boucle for.
Voici un exemple de sortie de la console windows attendus (ahah) de nombres aléatoires.
La fonction de temps probablement renvoie la même valeur lors de chaque itération de la boucle.
Essayez d'initialiser le générateur aléatoire avant la boucle.
Chaque itération, vous êtes en train de réinitialiser la séquence de nombres pseudo-aléatoires car vous appelez
srand
avec la même graine (car l'appel à latime
est si fréquent). Soit utiliser un autre graine, ou appelezsrand
une fois avant d'entrer dans la boucle.Si vous avez des randoms tôt dans le programme, vous pourriez multiplier la variable de boucle par le temps afin de donner une meilleure distribution. Par exemple
Eh bien, je ne suis pas un pro en C++, mais appris à l'école. Je suis à l'aide de cet algo pour passé 1 an pour stocker les différents aléatoire à valeurs dans un tableau 1D, mais cela permettra également de travailler dans le tableau 2D après quelques modifications.
Toutes les suggestions sur le code sont les bienvenus.
Ne sais pas les hommes. J'ai trouvé le meilleur moyen pour moi après l'essai de différentes façons comme 10 minutes.
( Changer les numéros de code pour obtenir de grandes ou de petites de nombre aléatoire.)