随机实数在 [0.1[ 使用梅森扭曲

Random real in [0..1[ using Mersenne Twister

本文关键字:实数 随机      更新时间:2023-10-16

我正在尝试使用简单的结构在 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;
}