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