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

标签 c++ montecarlo

<分区>

下面的代码可能不是最好看的,但它完成了工作。至少那是我的想法。当我尝试使用大于 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。您很可能已经超出了可用的堆栈大小。有一些编译器选项和运行时调用可以增加每个线程的堆栈空间量,但理想情况下,您只需从堆中分配那么多项目,而不是进行大量堆栈分配。那不是这个:

double GenR[NumPoints];

这个:

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

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

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

关于c++ - 为什么当我选择 >250000 个样本点时,程序不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862943/

相关文章:

c++ - 连接字符串和数字

python - 在 python 中矢量化蒙特卡洛模拟

c++ - 如何最有效地防止正态分布随机变量为零?

algorithm - 用于设计 AI 的蒙特卡罗方法示例

python - 投资组合优化的蒙特卡罗方法

c++ - 如何为 Windows 版 Mathematica 设置英特尔 C++ Composer XE?

c# - 在 C# 中使用 P/Invoke 注册 _set_purecall_handler 函数

c++ - 了解 Dlib 内核实现

C++ DLL 不会链接?

matlab - 如何在 MATLAB 中矢量化随机游走模拟