C ++ Повышение случайной числовой задачи генерации - PullRequest
0 голосов
/ 02 декабря 2010

Я должен сгенерировать случайное число, используя библиотеки повышения, я использую этот код:

boost::mt19937 gen;
boost::uniform_int<> dist(kUIMinManPort, kUIMaxManPort);
boost::variate_generator< boost::mt19937&, boost::uniform_int<> >
var(gen, dist);
unsigned int value = (unsigned int)var();
return boost::lexical_cast<std::string>(value);

Очевидно, я импортирую все необходимые библиотеки. Ну, код компилируется, но проблема в том, что я получаю те же числа ....

ОК ОК ... не волнуйтесь, я не новичок, когда говорю о случайной (или, лучше, псевдослучайной) генерации чисел. Я знаю, что мы должны предоставить начальное число и что в зависимости от этого начального числа будет предоставлена ​​последовательность псевдослучайных чисел.

Итак, мой код становится таким:

boost::mt19937 gen(static_cast<unsigned int>(std::time(0)));
boost::uniform_int<> dist(kUIMinManPort, kUIMaxManPort);
boost::variate_generator< boost::mt19937&, boost::uniform_int<> >
var(gen, dist);
unsigned int value = (unsigned int)var();
return boost::lexical_cast<std::string>(value);

Ну, проблема в том, что мы получаем почти одинаковое число каждый раз, когда я вызываю эту функцию (внутри цикла for). Я подозреваю, что зависящее от времени начальное число, предоставляемое ядру генерации вспомогательной случайной библиотеки, не изменяется в течение периода времени цикла, поэтому каждый раз, когда я запускаю цикл, получаю почти одинаковое число ... Вопрос в том, как эффективно решить эту проблему. Я полагаю, что дана лучшая практика ... Ну, я не единственный, у кого такая проблема:)

Спасибо ...

1 Ответ

4 голосов
/ 02 декабря 2010
static boost::mt19937 gen(static_cast<unsigned int>(std::time(0)));

static гарантирует, что генератор создается только один раз. Проблема в том, что time меняется недостаточно быстро. Если вы вызываете свою функцию в ту же миллисекунду, вы получите точно такие же результаты. К сожалению, ваш код настолько быстр, что вы вызываете его за одну и ту же миллисекунду.

Создание статического генератора (или одиночного шаблона, или глобальной переменной ...) решит проблему.

...