c++ - 为什么当我选择 >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;
}
解决方案
Adouble
为 8 个字节。其中 250K 是 2MB。您很可能已经超出了可用的堆栈大小。有编译器选项和运行时调用可以增加每个线程的堆栈空间量,但理想情况下,您只需在堆外分配那么多项目,而不是占用大量堆栈分配。那不是这个:
double GenR[NumPoints];
这个:
double* GenR = new double[NumPoints];
. . .
delete [] GenR;
或者更好的事件,只需使用具有数组语义的合适集合类,包括[]
运算符。阿拉载体:
std::vector<double> GenR;
GenR.resize(NumPoints);
推荐阅读
- networking - 无法从某些 vps 而不是其他 vps 访问 websocket 服务器?
- javascript - Webpack - 使用不同的 javascript 脚本文件生成多个 HTML 文件
- python - 未满足我的 While 循环条件
- r - 尝试提取州缩写
- javascript - 为每个类实例添加类到父 div
- c++ - 为什么我的“Cout”声明打印出随机的东西
- c++ - gai_cancel() 需要很长时间才能成功
- github - IntelliJ 中的“全部保存”和“git commit”之间的区别
- javascript - Javascript 中为空或空时不要传递变量
- java - 如何知道 Firebase 中是否有任何获取的数据?