使用c ++在2D随机数组生成中混淆

时间:2017-07-26 16:06:27

标签: arrays c++11

我使用以下代码生成两个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选项进行编译。      有谁知道原因?我感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

std::normal_distribution的典型实现实现Box–Muller transform - 一种成对生成正态分布数的算法。因此,当您第一次调用它时,它会生成一对数字并返回第一个数字,然后保存第二个数字以供日后使用。第二次调用它时,它会返回保存的数字。你第三次打电话,它再次产生两个数字;泡沫,冲洗重复。

因此,您的第一个案例实际上从未使用generator2distribution(generator)来电制作两个号码 - 一个进入peta,另一个进入pxi

在第二种情况下,peta填充generatorpxi填充generator2。你不会播种它们中的任何一个,这意味着它们都以相同的种子开始(无论默认值是什么),并且两者都产生相同的随机序列。因此,您最终会在两个数组中使用相同的值。