2009-10-28 5 views
11

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.

Antwort

11

Ihre Hypothese ist korrekt. Sie möchten, dass beide variate_generator Instanzen die gleiche Zufallsgeneratorinstanz verwenden. Verwenden Sie also einen Verweis auf mt19937 als Ihren Vorlagenparameter.

variate_generator<mt19937 &, normal_distribution<float> > nD(randgen, noise1); 
variate_generator<mt19937 &, normal_distribution<float> > nC(randgen, noise2); 

Offensichtlich werden Sie randgen, um sicherzustellen, haben nicht vor nD und nC out of scope tun geht.

+0

Das scheint perfekt zu funktionieren. Wird der interne Speicher des Zufallsgenerators durch den ersten Template-Parameter nur als Referenz definiert? Vielen Dank. – RandomGuy

+1

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

+1

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 (...); –

Verwandte Themen