【问题标题】:C++ pseudo random number generation platform dependency [duplicate]C ++伪随机数生成平台依赖项[重复]
【发布时间】:2018-12-17 16:56:41
【问题描述】:

下面的代码中是否有任何依赖于平台或编译器的内容?在 cygwin 中使用 g++ 编译时,它给出的值与使用 VC++ 编译时不同。如果可能,我想删除任何此类依赖项。

minstd_rand0 engine;
engine.seed(3113722101);
uniform_int_distribution<int> day_dist(1, 365);
uniform_real_distribution<double> quant_dist(0.0, 1.0);
ofstream fout(argv[1]);
for (int i = 0; i < years; ++i) {
    fout << (i + 1) << "\t";
    fout << day_dist(engine) << "\t";
    fout << quant_dist(engine) << "\t";
    fout << quant_dist(engine) << "\t";
    fout << quant_dist(engine) << "\n";
}
fout.close();

【问题讨论】:

  • 你的随机数的输出?
  • 能否请您包括两个程序的部分输出?
  • 来自 cygwin 下 g++ 的第 1 行:1 51 0.351901 0.818985 0.240108 来自 VC++ 的第 1 行:1 194 0.0580325 0.351901 0.39661

标签: c++ random


【解决方案1】:

引擎的规范指定了确切的算法,因此它们的输出在所有平台上应该是相同的。

分布的规范指定了结果,但没有指定算法。即使使用相同的引擎,它们的输出也会因平台而异。

【讨论】:

  • 这似乎是可能的解释。这是我怀疑的,但很高兴得到确认。我知道 default_random_engine 是依赖于实现的,所以我从我的代码中删除了它并尝试了随机引擎,直到我找到一个在我的计算机上给我与 g++ 相同的值的引擎。然后我惊讶地发现它仍然用 VC++ 给出不同的值,并怀疑分布也是实现定义的(因为它甚至可能是什么)。
  • 更多信息:我检查了文档,但没有找到说“实现定义”的地方:en.cppreference.com/w/cpp/numeric/random/…,这与 default_random_engine 的情况不同。 “满足...的所有要求”是否意味着定义的实现(受这些要求的约束)?
  • @EricAtAIR -- “定义的实现”意味着实现可以从各种备选方案中进行选择,并且它必须告诉您它的作用。分发的细节没有实现定义。
【解决方案2】:

除了产生均匀分布之外,对均匀分布没有任何限制。

标准库的作者可以使用他们喜欢的任何算法和实现,这样可能会在不同的平台上产生不同的结果。

您的选择是制作自己的发行版或找到具有适当许可证的开源发行版。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2020-08-26
    • 2015-08-07
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多