随机真实[0..1 [使用Mersenne Twister

时间:2014-12-30 23:22:04

标签: c++ random prng mersenne-twister

我试图使用简单的结构在c ++中创建一个僵尸apocalipse的模型,当我随机化群体时,我需要结构的某些字段在区间[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

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这是因为newr()newr.max()的返回值是整数,newr()返回的值小于而不是newr.mar()。除法的结果是一个零整数,然后转换为double。要解决此问题

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

答案 1 :(得分: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;
}