2009-10-28 11 views
11

Wydaje się, że można użyć następującego kodu do wytwarzania liczb losowych z danego rozkładu normalnego:zwiększyć liczbę losową bibliotekę, użyj tego samego generatora liczb losowych dla różnych generatorów variate

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

to działa prawidłowo, jednak ja chciałby, aby móc wyciągnąć numery od kilku wypłat, czyli można by pomyśleć coś takiego:

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

jednak problem pojawia się, że nD() i nC() generują podobne sekwencje liczb. Przypuszczam, że to dlatego, że konstruktor dla variate_generator wydaje się tworzyć kopię Randgena, a nie używać go jawnie. W ten sposób generowana jest ta sama sekwencja pseudo-losowa i po prostu przepychana przez różne transformacje (ze względu na różne parametry rozkładów).

Czy ktoś wie, czy istnieje sposób w Boost, aby utworzyć generator liczb losowych i użyć go do wielu dystrybucji? Alternatywnie, czy konstrukcja biblioteki losowej Boost ma na celu stworzenie jednego generatora liczb losowych na dystrybucję? Oczywiście, mógłbym napisać kod, aby przekształcić sekwencję jednolitych liczb losowych w sekwencję z dowolnej dystrybucji, ale szukam czegoś prostego i już wbudowanego w bibliotekę.

Z góry dziękuję za pomoc.

Odpowiedz

11

Twoja hipoteza jest prawidłowa. Chcesz, aby instancje variate_generator używały tej samej instancji generatora liczb losowych. Dlatego jako parametr szablonu użyj odniesienia do mt19937.

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

Oczywiście musisz zapewnić randgen nie wykracza poza zakres przed nD i nC zrobić.

+0

Wygląda na to, że działało idealnie. Czy wprowadzenie pierwszego parametru szablonu powoduje jedynie zmianę wewnętrznej pamięci generatora liczb losowych na referencję? Dzięki. – RandomGuy

+1

Tak. Klasa generatora zmiennych jest (stosunkowo) prosta. Oryginalna instancjonowana klasa miała zmienną składową typu 'mt19937'. Prawidłowy, miał zmienną składową, aby wpisać 'mt19937 &'. Brak dodatkowych zmian. – AFoglia

+1

Użycie odnośnika do mt19937 powoduje, że generator wariacji jest nieprzenoszalny; jeśli potrzebujesz przypisania, możesz zamiast tego użyć typu wskaźnika. To znaczy. variate_generator > nD (...); –

Powiązane problemy