Ускорить библиотеку случайных чисел, использовать тот же генератор случайных чисел для разных генераторов колебаний
Кажется, что для получения случайных чисел из определенного нормального распределения можно использовать следующий код:
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();
Это прекрасно работает, однако, я хотел бы иметь возможность рисовать числа из нескольких распределений, т.е. можно было бы подумать примерно так:
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();
Однако проблема заключается в том, что nD() и nC() генерируют аналогичные последовательности чисел. Я выдвигаю гипотезу, потому что конструктор для variate_generator, похоже, делает копию randgen, а не использует его явно. Таким образом, создается одна и та же псевдо-случайная последовательность и просто проталкивается через различные преобразования (из-за разных параметров распределений).
Кто-нибудь знает, есть ли способ, в Boost, создать единый генератор случайных чисел и использовать его для нескольких распределений? В качестве альтернативы, позволяет ли создать произвольную библиотеку Boost пользователей создавать один генератор случайных чисел для каждого дистрибутива? Очевидно, я мог написать код, чтобы преобразовать последовательность равномерных случайных чисел в последовательность из произвольного распределения, но я ищу что-то простое и уже встроенное в библиотеку.
Заранее благодарим за помощь.
Ответы
Ответ 1
Ваша гипотеза верна. Вы хотите, чтобы оба экземпляра variate_generator
использовали один и тот же экземпляр генератора случайных чисел. Поэтому в качестве параметра шаблона используйте ссылку на mt19937
.
variate_generator<mt19937 &, normal_distribution<float> > nD(randgen, noise1);
variate_generator<mt19937 &, normal_distribution<float> > nC(randgen, noise2);
Очевидно, вам нужно будет убедиться, что randgen
не выходит за пределы области действия до nD
и nC
do.