【问题标题】:Random real in [0..1[ using Mersenne Twister[0..1[ 中的随机实数使用 Mersenne Twister
【发布时间】:2015-02-27 02:59:31
【问题描述】:

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

有什么想法吗?

【问题讨论】:

  • 使用std::uniform_real_distribution

标签: c++ random prng mersenne-twister


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,我会尽快将其标记为正确答案。我早该想到这个的,哈哈。
  • 最好是static_cast&lt;double&gt;(foo),可能。
  • @AlexReynolds 只是为了符合习惯,当然;p
  • 我认为新版本的 clang++ 会在(double)foo 风格的转换上窒息。 static_cast 方法可能更具前瞻性。 YMMV。
  • @Pedro 这不会给出均匀分布,特别是1.0 比任何其他位组合发生的可能性极小。您没有为此使用标准库包装器的任何原因?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2014-02-22
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多