Подтвердить что ты не робот

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

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

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 пользователей создавать один генератор случайных чисел для каждого дистрибутива? Очевидно, я мог написать код, чтобы преобразовать последовательность равномерных случайных чисел в последовательность из произвольного распределения, но я ищу что-то простое и уже встроенное в библиотеку.

Заранее благодарим за помощь.

4b9b3361

Ответ 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.