Es scheint, dass man den folgenden Code verwenden, kann Zufallszahl aus einer bestimmten Normalverteilung zu erzeugen:Zufallszahl Bibliothek steigern, verwendet denselben Zufallszahlengenerator für verschiedene variate Generatoren
float mean = 0, variance = 1;
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0)));
boost::normal_distribution<float> noise(mean, variance);
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise);
float random = nD();
Dies funktioniert gut, ich aber, möchten Zahlen zu ziehen, aus mehreren Verteilungen in der Lage sein, also würde man denken, so etwas wie:
float mean1 = 0, variance1 = 1, mean2 = 10, variance2 = 0.25;
boost::mt19937 randgen(static_cast<unsigned int>(std::time(0)));
boost::normal_distribution<float> noise1(mean1, variance1);
boost::normal_distribution<float> noise2(mean2, variance2);
variate_generator<mt19937, normal_distribution<float> > nD(randgen, noise1);
variate_generator<mt19937, normal_distribution<float> > nC(randgen, noise2);
float random1 = nD();
float random2 = nC();
jedoch das Problem zu sein scheint, dass nD() und nC() ähnliche Zahlenfolgen erzeugen. Ich nehme an, dies liegt daran, dass der Konstruktor für variate_generator scheinbar eine Kopie von randgen erstellt, nicht explizit verwendet. Somit wird die gleiche pseudo-zufällige Sequenz erzeugt und einfach durch verschiedene Transformationen geschoben (aufgrund der unterschiedlichen Parameter der Verteilungen).
Weiß jemand, ob es in Boost einen Weg gibt, einen einzigen Zufallszahlengenerator zu erstellen und ihn für mehrere Distributionen zu verwenden? Oder beabsichtigt das Design der Boost-Zufallsbibliothek Benutzer, einen Zufallszahlengenerator pro Distribution zu erstellen? Offensichtlich könnte ich Code schreiben, um eine Folge einheitlicher Zufallszahlen in eine Sequenz aus einer willkürlichen Verteilung zu transformieren, aber ich suche nach etwas Einfachem, das bereits in die Bibliothek eingebaut ist.
Vielen Dank im Voraus für Ihre Hilfe.
Das scheint perfekt zu funktionieren. Wird der interne Speicher des Zufallsgenerators durch den ersten Template-Parameter nur als Referenz definiert? Vielen Dank. – RandomGuy
Ja. Die Variatengeneratorklasse ist (relativ) einfach. Die ursprüngliche instanziierte Klasse hatte eine Membervariable vom Typ 'mt19937'. Der richtige, hatte eine Membervariable, um 'mt19937 &' einzugeben. Es treten keine zusätzlichen Änderungen auf. – AFoglia
Die Verwendung eines Verweises auf mt19937 macht den Variatengenerator nicht zuweisbar; Wenn Sie eine Zuweisung benötigen, können Sie stattdessen einen Zeigertyp verwenden. I.e. variate_generator nD (...); –