Я пытаюсь создать модель апокалипсиса зомби в c ++, используя простые структуры, и когда я рандомизирую популяцию, мне нужно, чтобы некоторые поля структуры имели значение в интервале [0..1 [. Поскольку я заинтересован в более статистически правильном анализе, я решил использовать механизм mt19937 для генерации моих «данных». Играя с этим PRNG, я не смог найти способ сгенерировать число в указанном диапазоне. Вот код, который я придумал:
int
main ( int argc, char** argv )
{
mt19937_64 newr ( time ( NULL ) );
std::cout << newr.max ( ) << endl;
std::cout << newr.min ( );
double rn;
for(;;){
rn = newr()/newr.max ();
std::cout << rn << std::endl;
}
}
Но единственные выводы, которые я получаю для цикла, это нули (0). Небольшой шрифт выводится вниз:
18446744073709551615
0
0
0
0
0
0
0
0
0
0
0
Есть идеи?
Это происходит потому, что возвращаемое значение newr()
а также newr.max()
целые числа и значение, возвращаемое newr()
является меньше чем newr.mar()
, Результатом деления является нулевое целое число, которое затем преобразован в double
, Чтобы исправить это использование
rn = static_cast<double>(newr()) / newr.max();
Вы делите int
от int
и так иметь целочисленное округление.
Способ использования случайного движка — одно из различных распределений,
в твоем случае std::uniform_real_distribution
:
std::mt19937_64 engine ( time ( NULL ) );
std::uniform_real_distribution<double> dist(0., 1.);
for(;;){
const double rn = dist(engine);
std::cout << rn << std::endl;
}