Случайное вещественное в [0..1 [с использованием Mersenne Twister

Я пытаюсь создать модель апокалипсиса зомби в 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

Есть идеи?

0

Решение

Это происходит потому, что возвращаемое значение newr() а также newr.max() целые числа и значение, возвращаемое newr() является меньше чем newr.mar(), Результатом деления является нулевое целое число, которое затем преобразован в double, Чтобы исправить это использование

rn = static_cast<double>(newr()) / newr.max();
3

Другие решения

Вы делите 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;
}
3

По вопросам рекламы [email protected]