Ускорить библиотеку случайных чисел, использовать тот же генератор случайных чисел для разных генераторов колебаний

Кажется, что для получения случайных чисел из определенного нормального распределения можно использовать следующий код:

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.