J'ai un Que maintenant, normalement Les valeurs "1" et "2" modifient lorsque je l'exécute plusieurs fois, mais sont toujours les mêmes pendant 15 fois. P > puisque la boucle est exécutée 15 fois différents, ne devrait pas Quand Je n'ai pas pour code> boucle qui fonctionne 15 fois, avec dh.setdoors () code> dans chaque itération. SetDoors code> Est-ce que l'appel srand (heure (0)) code>, alors chaque fois qu'un nombre aléatoire est nécessaire, il utilisera, par exemple, carectionter = rand ()% 3 + 1 code>. Alternativement, il peut utiliser Decider = rand ()% 2 + 1 code>. P> Decider code> et carectionter code> sont Utilisé de différentes manières, mais j'ai soupçonné un problème et je l'ai fait imprimer carectionter code> et Decider code> à chaque itération. Voici ce qui est sorti: p> carectionter code> et Decider code> imprimer un numéro aléatoire différent de chaque itération? P> srand (heure (0)) code>, cela fonctionne comme prévu, mais il n'y a pas de jeu de graines, c'est donc la même séquence de nombres "aléatoires" à chaque fois, c'est donc probablement un problème avec la graine? p> p>
4 Réponses :
Vous devez exécuter Lorsque vous exécutez srand code> au début de votre programme, par exemple dans le Main code> -fonction. P>
srand (heure (0)) code> en haut de la fonction dans laquelle vous utilisez rand () code>, vous êtes susceptible de le donner la même chose semences à chaque fois. TIME (0) CODE> donne le temps en secondes, vous devez donc éviter d'appeler SetDoors code> deux fois dans la même seconde afin d'obtenir des chiffres différents à chaque fois. Si vous do em> appelez setdoors code> deux fois dans la même seconde, la graine aléatoire sera identique, et les appels suivants vers rand () code> généreront le même séquence de nombres pseudorandom. P>
Comme Kerrek dit, l'ensemencement n'est effectué qu'une fois, au début du programme. Après un srand appeler rand autant de fois que vous le souhaitez. P>
Lorsque vous appelez Lorsque vous êtes dans une boucle et appelez srand (x) code>, la valeur de x code> détermine la séquence de nombres pseudo-aléatoires renvoyées dans les appels suivants à rand () , dépendant entièrement de la valeur de x code> em>. srand () code> à la TOP: P> srand(time(0));
while (...) {
x = rand();
y = rand();
}
Mettez sur mes chaussures bleus Psuedo ... i>
Chaque fois que vous invoquez Cependant, puisque vous avez décidé d'appeler srand (heure (0)) code>, vous êtes ensemencement em> le générateur de nombres pseudo-aléatoires, l'insufflant avec une nouvelle séquence pseudo-aléatoire de Nombres. La séquence est différente selon laquelle l'argument à srand code> est, et dans cette instance, vous utilisez heure (0) code> donc, supposant que vous appelez votre programme au plus une fois par seconde, Vous obtiendrez toujours une nouvelle séquence. Lorsque vous appelez rand () code>, vous obtenez simplement le numéro suivant dans cette séquence. P>
srand code> plusieurs fois dans votre programme, et parce que votre programme est rapide (c'est-à-dire heure (0) code> ne change pas) Tout ce que vous faites est de réinitialiser à plusieurs reprises le PRNG à la même séquence. C'est pourquoi vous obtenez toujours les mêmes valeurs - vous continuez à retirer le PRNG pour être la même séquence, ce qui déplace également le curseur au début de la séquence. P>
L'ensemencement devrait être fait une fois i>, jamais. Lisez sur la façon dont les générateurs de nombres pseudo-aléatoires fonctionnent, et il est probablement bon d'apprendre une théorie de probabilité de probabilité aussi pendant que vous y êtes.
Je n'utilise que Srand une fois dans SetDoors, SetDoors est simplement répété 15 fois. Le problème est-il répété Srand 15 fois?
Il serait plus facile de décrire la solution lorsque vous Postez votre code actuel i>.
@Glasszee: Oui. Comme Kerrek l'a déjà dit, vous devriez faire
srand code> une fois dans votre programme.@Greghewgill: ... c'est-à-dire que le réel i> TESTCASE minimal complet que l'OP débogue avec.
Un commentaire sur style: vous utilisez
0 code> comme valeur du pointeur dansheure (0) code>. Dans moderne C ++, en particulier avec C ++ 11, il est une mauvaise idée d'utiliser0 code> comme un pointeur. Utiliseznullptr code> si les compilateurs que vous ciblez prennent en charge la prise en charge:srand (heure (nullptr)) code>. Si le compilateur ne prend pas en chargenullptr code> puisnull code> est au moins une petite amélioration sur0 code>. De plus, la bibliothèquecode> code> est excellente, bien que cela puisse être un peu au-delà d'un étudiant de première semaine.