Ich möchte zufällige Sequenzen zurücksetzen, indem Sie verschiedene Seed-Nummern verwenden. Wenn Sie diesen Testcode ausführen:
%Vor%Ich bekomme folgende Ausgabe:
%Vor%Offensichtlich mache ich etwas sehr falsch. Wie kann ich dieses Problem überwinden?
Im Anschluss an Jim, Alan und Igor wurden einige Änderungen am Code vorgenommen: rng.engine().seed()
anstelle von gener.seed()
, und rng.distribution().reset()
wurden nach dem Aufruf von rng.engine().seed()
aufgerufen und es funktionierte wie ein Charm.
Vielen Dank!
Sie sollten normal.reset () nach dem Aufruf von gener.seed () aufrufen. Dies wird spezifiziert, um sicherzustellen, dass die Ausgabe von normal nicht von irgendeiner vorherigen Ausgabe von gener abhängt.
(Die Verteilung speichert wahrscheinlich einen Zustand, den Sie löschen müssen.)
Ich glaube, boost::variate_generator<>
erstellt eine Kopie Ihres boost::mt19937 gener
-Objekts.
Wenn Sie Ihre Kopie von gener
erneut erstellt haben, hat dies keine Auswirkungen auf das bereits vorhandene Objekt rng
wurde gebaut. Das Erstellen eines neuen rng
-Objekts bei jeder erneuten Erstellung sollte Ihnen das gewünschte Verhalten geben (Disclaimer: nicht getestet!)
Schön, dass das Problem gelöst ist! Aber ich denke, ich habe gerade herausgefunden, warum Alans Methode nicht funktionieren würde.
Beim Schreiben von boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > rng(gener, normal)
haben Sie keine weitere Kopie von gener
erstellt, weil es sich um einen Verweis handelt, aber Sie haben eine weitere Kopie von normal
mit variate_generate
erstellt.
Also anstelle von normal.reset
, das nur die ursprüngliche normal
zurücksetzt, sollten Sie rng.distribution().reset()
verwenden. Aber du kannst gener.seed()
behalten, was vermutlich den gleichen Effekt hat wie rng.engine().seed()
.
Ich habe es in meinem Code getestet und es hat wie erwartet funktioniert.
Nun, nur für den Fall, dass es jemand interessieren würde:)