2014-12-30 5 views
0

Я пытаюсь создать модель апокалипсиса зомби в C++, используя простые структуры, а когда я произвожу популяцию, мне нужны некоторые поля структуры для имеют значение в интервале [0..1 [. Поскольку меня интересует более статистически корректный анализ, я решил использовать механизм mt19937 для генерации моих «данных». Когда вы играли с этим PRNG, я не мог найти способ генерировать число в указанном диапазоне. Вот код, который я придумал:Случайный реальный в [0..1 [используя Mersenne Twister

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 

Любые идеи?

+4

'INT/INT = int'. –

+1

Используйте 'std :: uniform_real_distribution'. –

ответ

3

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

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

Огромное вам спасибо, как только смогу, я отмечу это как правильный ответ. Я должен был подумать об этом ранее. – Pedro

+1

Было бы лучше сделать 'static_cast (foo)', возможно. –

+0

@AlexReynolds Просто быть идомальным, конечно, p –

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; 
}