我使用以下代码生成两个2D随机数组:
#include <iostream>
#include <string>
#include <random>
#include <iomanip>
#include <new>
#include <math.h>
int main ()
{
std::default_random_engine generator,generator2;
std::normal_distribution<double> distribution;
double **peta, **pxi;
const int Nmodes =200;
const double PI=3.1415926;
peta = new double*[3];
pxi = new double*[3];
for (int i=0; i<3; ++i)
{
peta[i] = new double[Nmodes];
pxi[i] = new double[Nmodes];
}
distribution.param(std::normal_distribution<double>(0.0,1.0).param());
for (int i=0; i<3; ++i)
{
for (int j=0; j<Nmodes; ++j)
{
peta[i][j]=distribution(generator);
// pxi[i][j] =distribution(generator2); //1st case
}
for (int j=0; j<Nmodes; ++j)
{
pxi[i][j] =distribution(generator2); //2nd case
}
}
std::cout<<std::setprecision(15)<<"peta "<<peta[0][20]<<'+'<<peta[1][20]<<'+'<<peta[2][20]<<'+'<<peta[2][30]<<std::endl;
std::cout<<"pxi "<<pxi[0][20]<<"+"<<pxi[1][20]<<'+'<<pxi[2][20]<<'+'<<pxi[2][30]<<std::endl;
for (int i=0; i<3; ++i)
{
delete [] peta[i];
delete [] pxi[i];
}
delete [] peta;
delete [] pxi;
return 0;
}
在上面的代码中,我生成了peta和pxi 2d数组。在第一种情况下,我在嵌套的for循环中一起编写它们,而在第二种情况下,我为第二个循环分别编写它们(请参阅代码中的注释区域)。对于案例1,peta和pxi是不同的,但它们在情况2中是相同的。我认为它们应该是相同的,因为生成器是等效的,即使它们是不同的变量。我使用gcc 4.8.4和-std = c ++ 11选项进行编译。 有谁知道原因?我感谢您的帮助。
答案 0 :(得分:1)
std::normal_distribution
的典型实现实现Box–Muller transform - 一种成对生成正态分布数的算法。因此,当您第一次调用它时,它会生成一对数字并返回第一个数字,然后保存第二个数字以供日后使用。第二次调用它时,它会返回保存的数字。你第三次打电话,它再次产生两个数字;泡沫,冲洗重复。
因此,您的第一个案例实际上从未使用generator2
。 distribution(generator)
来电制作两个号码 - 一个进入peta
,另一个进入pxi
。
在第二种情况下,peta
填充generator
,pxi
填充generator2
。你不会播种它们中的任何一个,这意味着它们都以相同的种子开始(无论默认值是什么),并且两者都产生相同的随机序列。因此,您最终会在两个数组中使用相同的值。