6
votes

Mêmes numéros aléatoires chaque itération de boucle

J'ai un pour boucle qui fonctionne 15 fois, avec dh.setdoors () dans chaque itération.

Que SetDoors Est-ce que l'appel srand (heure (0)) , alors chaque fois qu'un nombre aléatoire est nécessaire, il utilisera, par exemple, carectionter = rand ()% 3 + 1 . Alternativement, il peut utiliser Decider = rand ()% 2 + 1 .

maintenant, normalement Decider et carectionter sont Utilisé de différentes manières, mais j'ai soupçonné un problème et je l'ai fait imprimer carectionter et Decider à chaque itération. Voici ce qui est sorti: xxx

Les valeurs "1" et "2" modifient lorsque je l'exécute plusieurs fois, mais sont toujours les mêmes pendant 15 fois.

puisque la boucle est exécutée 15 fois différents, ne devrait pas carectionter et Decider imprimer un numéro aléatoire différent de chaque itération?

Quand Je n'ai pas srand (heure (0)) , 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?


6 commentaires

L'ensemencement devrait être fait une fois , 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 .


@Glasszee: Oui. Comme Kerrek l'a déjà dit, vous devriez faire srand une fois dans votre programme.


@Greghewgill: ... c'est-à-dire que le réel TESTCASE minimal complet que l'OP débogue avec.


Un commentaire sur style: vous utilisez 0 comme valeur du pointeur dans heure (0) . Dans moderne C ++, en particulier avec C ++ 11, il est une mauvaise idée d'utiliser 0 comme un pointeur. Utilisez nullptr si les compilateurs que vous ciblez prennent en charge la prise en charge: srand (heure (nullptr)) . Si le compilateur ne prend pas en charge nullptr puis null est au moins une petite amélioration sur 0 . De plus, la bibliothèque est excellente, bien que cela puisse être un peu au-delà d'un étudiant de première semaine.


4 Réponses :


2
votes

Vous devez exécuter srand au début de votre programme, par exemple dans le Main -fonction.

Lorsque vous exécutez srand (heure (0)) en haut de la fonction dans laquelle vous utilisez rand () , vous êtes susceptible de le donner la même chose semences à chaque fois. TIME (0) donne le temps en secondes, vous devez donc éviter d'appeler SetDoors deux fois dans la même seconde afin d'obtenir des chiffres différents à chaque fois. Si vous do appelez setdoors deux fois dans la même seconde, la graine aléatoire sera identique, et les appels suivants vers rand () généreront le même séquence de nombres pseudorandom.


0 commentaires

2
votes

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.


0 commentaires

12
votes

Lorsque vous 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>.

Lorsque vous êtes dans une boucle et appelez srand () code> à la TOP: P>

srand(time(0));

while (...) {
    x = rand();
    y = rand();
}


1 commentaires

Mettez sur mes chaussures bleus Psuedo ...



3
votes

Chaque fois que vous invoquez srand (heure (0)) , vous êtes ensemencement 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 est, et dans cette instance, vous utilisez heure (0) donc, supposant que vous appelez votre programme au plus une fois par seconde, Vous obtiendrez toujours une nouvelle séquence. Lorsque vous appelez rand () , vous obtenez simplement le numéro suivant dans cette séquence.

Cependant, puisque vous avez décidé d'appeler srand plusieurs fois dans votre programme, et parce que votre programme est rapide (c'est-à-dire heure (0) 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.

graine une fois. Une fois.


0 commentaires