首页 > 解决方案 > 为什么当我选择 >250000 个样本点时,程序不起作用?

问题描述

下面的代码可能不是最好看的,但它完成了工作。至少我是这么想的。当我尝试使用大于 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;
}

标签: c++montecarlo

解决方案


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

double GenR[NumPoints];

这个:

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

或者更好的事件,只需使用具有数组语义的合适集合类,包括[]运算符。阿拉载体:

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

推荐阅读