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。不,但是你可以制作一个包装器来交换返回的数字对。