Einstellung Saatgut boost::random
Ich würde gerne zurücksetzen-random-Sequenzen mit unterschiedlichen seed-Nummern. Beim ausführen dieser test code:
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;
Bekomme ich die folgende Ausgabe:
# 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
Offensichtlich mache ich etwas sehr falsch. Wie kann ich dieses problem lösen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgenden Jim, Alan und Igor Vorschläge gemacht, einige änderungen am code:
rng.engine().seed()
stattgener.seed()
und riefrng.distribution().reset()
nach dem Aufrufrng.engine().seed()
und es funktionierte wie ein Charme.Vielen Dank!
Sollte man normal nennen.reset() nach dem Aufruf von gener.seed(). Angegeben ist, um sicherzustellen, dass die Ausgabe normal wird nicht davon abhängen, ob alle vorherigen Ausgabe von gener.
(Die Verteilung ist wahrscheinlich caching einige Staat, die Sie benötigen, um zu löschen.)
Ich glaube
boost::variate_generator<>
macht eine Kopie Ihrerboost::mt19937 gener
Objekt.Also, wenn Sie ein erneutes Seeding Ihre Kopie von
gener
, es hat keine Auswirkung auf dierng
Objekt, das bereitskonstruiert worden. Mit dem Bau eines neuen
rng
Objekt jedes mal, wenn Sie ein erneutes Seeding sollte Ihnen das von Ihnen gewünschte Verhalten (disclaimer: nicht getestet!)boost::variate_generator<>
macht eine Kopie vongener
in diesem Fall? Ich denke, die OP bestanden Referenz, wenn das schreibenboost::variate_generator<boost::mt19937&,boost::normal_distribution<> >
, bin ich etwas fehlt?...Toll zu sehen, wie das problem gelöst! Aber ich denke, ich habe gerade rausgefunden, warum Alan die Methode nicht funktionieren würde...
Beim schreiben
boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal)
Sie nicht erstellen Sie eine andere Kopie vongener
weil es ein call-by-reference, aber Sie hat erstellen Sie eine andere Kopie vonnormal
mit dervariate_generate
.Also statt
normal.reset
, die setzt nur die originalnormal
verwenden, sollten Sierng.distribution().reset()
. Aber Sie können nur haltengener.seed()
, was ich vermute, wird die gleiche Wirkung haben wierng.engine().seed()
.Getestet habe ich es in meinem code, und es funktioniert wie erwartet.
Gut, nur, falls jemand kümmern würde 🙂