为什么当我选择 >250000 个样本点时,程序不起作用?

Why is it that when I choose >250000 sample points, the program does not work?

可能下面的代码不是最好看的,但它完成了工作。至少那是我的想法。当我尝试使用大于 250,0000 的样本点时遇到问题。我真的不知道该怎么做。

我唯一尝试过的是将变量类型从 int 切换为 long。

double MonteCarlo(){

const long N = 250000;
double GenR[NumPoints],apprx;
static double result[1];
double sum = 0;

default_random_engine generator;
uniform_real_distribution<double> distribution(0.0,1.0);

for(int i=0; i<=NumPoints; i++){

    randGen[i] = distribution(generator);
    sum += 4*exp(16*pow(GenR[i],2)-12*GenR[i]+2);
}

apprx = sum/NumPoints;

return apprx;
}

一个double是8个字节。这些东西中的 250K 是 2MB。您很可能已经超出了可用的堆栈大小。有编译器选项和 运行 时间调用可以增加每个线程的堆栈数量 space,但理想情况下,您只需从堆中分配那么多项目,而不是进行大量堆栈分配。那不是这个:

double GenR[NumPoints];

这个:

double* GenR = new double[NumPoints];
. . .
delete [] GenR;

或者更好的是,只需使用合适的集合 class,它具有包含 [] 运算符的数组语义。丙氨酸载体:

std::vector<double> GenR;
GenR.resize(NumPoints);