увеличить библиотеку случайных чисел, использовать один и тот же генератор случайных чисел для разных генераторов переменных - PullRequest
11 голосов
/ 28 октября 2009

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

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

11 голосов
/ 28 октября 2009

Ваша гипотеза верна. Вы хотите, чтобы оба экземпляра variate_generator использовали один и тот же экземпляр генератора случайных чисел. Поэтому используйте ссылку на mt19937 в качестве параметра шаблона.

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

Очевидно, вы должны убедиться, что randgen не выйдет за рамки до того, как nD и nC сделают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...