Réglage de graines de boost::aléatoire
Je voudrais réinitialiser séquences aléatoires à l'aide de différents numéros de semences. Lors de l'exécution de ce code de test:
boost::mt19937 gener(1);
boost::normal_distribution<> normal(0,1);
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal);
cout << rng() << endl;
cout << rng() << endl;
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
cout << rng() << endl;
gener.seed(1);
cout << rng() << endl;
gener.seed(2);
cout << rng() << endl;
gener.seed(3);
cout << rng() << endl;
J'obtiens le résultat suivant:
# seed(1) via constructor
-2.971829031
1.706951063
-0.430498971
# seed(2)
-2.282022417
-0.5887503675
# seed(1)
0.2504171986
# seed(2)
-0.5887503675
# seed(3)
0.2504171986
Évidemment, je suis en train de faire quelque chose de très mal. Comment puis-je résoudre ce problème?
OriginalL'auteur anton skvorts | 2011-01-24
Vous devez vous connecter pour publier un commentaire.
Suivantes Jim, Alan et Igor suggestions apporté quelques modifications au code:
rng.engine().seed()
au lieu degener.seed()
, et a appelérng.distribution().reset()
après l'appel àrng.engine().seed()
et cela a fonctionné comme un charme.Merci beaucoup!
OriginalL'auteur anton skvorts
Vous devez appeler la normale.reset() après l'appel à la gener.de la graine(). Qui est spécifiée pour s'assurer que la sortie de la normale ne dépendra pas de la précédente sortie de gener.
(La distribution est probablement la mise en cache de l'état que vous souhaitez effacer.)
Normalement distribués Rng utiliser le Box-Muller transformer qui génère des nombres aléatoires dans les paires (voir: Recettes ou Numérique exemples)
OriginalL'auteur Alan Stokes
Je crois
boost::variate_generator<>
fait une copie de votreboost::mt19937 gener
objet.Ainsi, lorsque vous réensemencer votre copie de
gener
, il n'a pas d'effet sur larng
objet qui est déjàété construits. La construction d'une nouvelle
rng
objet à chaque fois que vous réamorçage devrait vous donner le comportement que vous souhaitez (avertissement: pas testé!)Grand de voir le problème résolu, mais je peux te demander pourquoi
boost::variate_generator<>
fait une copie degener
dans ce cas? Je pense que l'OP passée de référence lors de la rédaction deboost::variate_generator<boost::mt19937&,boost::normal_distribution<> >
, suis-je raté quelque chose?...OriginalL'auteur Jim Lewis
Grand de voir le problème résolu! Mais je suppose que je viens de comprendre pourquoi Alan méthode ne fonctionne pas...
Lors de l'écriture de
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal)
, vous n'avez pas créer une autre copie degener
parce que c'est un appel par référence, mais vous ne créer une autre copie denormal
avec levariate_generate
.Ainsi, au lieu de
normal.reset
, qui ne permet de restaurer l'originalnormal
, vous devez utiliserrng.distribution().reset()
. Mais vous pouvez juste gardergener.seed()
, ce qui je pense aura le même effet querng.engine().seed()
.Je l'ai testé dans mon code, et il a fonctionné comme prévu.
Bien, juste au cas où quelqu'un aurait soins 🙂
OriginalL'auteur Vokram