Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么GCC和MSVC标准::正态分布不同?_C++_Visual Studio_C++11_Gcc_Visual C++ - Fatal编程技术网

C++ 为什么GCC和MSVC标准::正态分布不同?

C++ 为什么GCC和MSVC标准::正态分布不同?,c++,visual-studio,c++11,gcc,visual-c++,C++,Visual Studio,C++11,Gcc,Visual C++,我有一个简单的代码示例: #include <iostream> #include <random> using namespace std; int main() { minstd_rand0 gen(1); uniform_real_distribution<double> dist(0.0, 1.0); for(int i = 0; i < 10; ++i) { cout << "1 " <

我有一个简单的代码示例:

#include <iostream>
#include <random>
using namespace std;
int main() {
    minstd_rand0 gen(1);
    uniform_real_distribution<double> dist(0.0, 1.0);
    for(int i = 0; i < 10; ++i) {
        cout << "1 " << dist(gen) << endl;
    }

    normal_distribution<double> dist2(0.0, 1.0);
    minstd_rand0 gen2(1);
    for(int i = 0; i < 10; ++i) {
        cout << "2 " << dist2(gen2) << endl;
    }

    return 0;
}
#包括
#包括
使用名称空间std;
int main(){
minstd_rand0 gen(1);
均匀实分布距离(0.0,1.0);
对于(int i=0;i<10;++i){

cout这是有问题的,但不幸的是,该标准没有详细说明在构造(许多)随机分布的数字时使用什么算法,并且有几个有效的替代方案,具有不同的好处

26.6.8.5正态分布[rand.dist.norm] 26.6.8.5.1类模板正态分布[rand.dist.norm.normal]

正态分布随机数分布产生随机数 根据概率密度函数分布的数字x

参数μ和也称为该分布的平均值和 标准差

生成正态分布数字的最常见算法是,但即使使用该算法,也存在选项和变体

标准中甚至明确提到了自由:

26.6.8随机数分布类别模板[rand.dist]

3 生成每个指定分布的算法如下所示: 实现定义

这方面的一个转到选项是

顺便说一句,正如@Hurkyl所指出的:这两种实现似乎实际上是相同的:例如,box muller生成成对的值,其中一个返回,另一个缓存。这两种实现只在返回哪一个值上有所不同


此外,随机数引擎是完全指定的,并将在实现之间提供相同的序列,但需要注意,因为不同的发行版也可能消耗不同数量的随机数据以产生其结果,这将使引擎不同步。

与定义的PRN生成器不同根据必须为同一种子产生相同输出的标准,该标准不保留[rand.dist.general]/3的发行授权

生成每个指定分布的算法是实现定义的

所以在这种情况下,即使分布必须有一个密度函数,形式为

如何实现这一点取决于他们


获得便携分发版的唯一方法是自己编写一个或使用第三方库。

很吸引人。我本以为它们有100%不同或100%相同的数字。事实上它们是相同的,但重新排列了。而且
统一真实分发版
的结果与预期的一样!@MooingDuck:The这里的标准算法每次迭代都会产生两个值。看起来它们都使用相同的算法实现,但在返回哪一个值和缓存哪一个值上有所不同。它们可能都使用Knuth算法(第2卷,第122页,Algop)。它会重复生成2个随机数,直到满足约束条件。因此,如果您有两个好的数字,您可以返回其中一个,并保留另一个供下次调用。您可以猜测其余的。有趣的是,clang++遵循MSVCI提供生成器…遵循Hurkyl点,是否可以为MSVC或GCC种子,以便它们提供相同的结果吗?@DuckQueen。不,但是你可以制作一个包装器来交换返回的数字对。