【问题标题】:Why is it that when I choose >250000 sample points, the program does not work? [duplicate]为什么当我选择 >250000 个样本点时,程序不起作用? [复制]
【发布时间】:2019-09-10 01:30:54
【问题描述】:

下面的代码可能不是最好看的,但它可以完成工作。至少我是这么想的。当我尝试使用大于 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 GenR[NumPoints] 可能正在消耗您拥有的所有内存。要解决这个问题,请尝试使用堆内存分配它
  • "我遇到一个问题" 这是……? “程序不工作”不工作...怎么办?
  • @AlgirdasPreidžius 它运行代码,但不显示任何输出并声明返回值为 3221225725
  • @Amadeus 对不起,我该怎么做呢?我是 C++ 的初学者,我实际上并不知道堆内存是什么意思
  • @DMH16 那么,为什么这些信息不是问题?它准确地说明了问题所在:3221225725 = 0xC00000FD =“堆栈溢出”。最可能的罪魁祸首是您的阵列。只需使用std::vector。如果您是初学者,请考虑从 good C++ book 以结构化方式学习 C++。

标签: c++ montecarlo


【解决方案1】:

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

double GenR[NumPoints];

这个:

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

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

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

【讨论】:

  • 是的,这行得通!谢谢!
猜你喜欢
  • 2019-05-25
  • 2021-01-08
  • 2019-01-17
  • 2016-01-14
  • 2018-09-28
  • 2021-05-14
  • 1970-01-01
  • 2019-06-23
  • 2014-08-11
相关资源
最近更新 更多