c++ - 使用均匀分布的随机数进行蒙特卡罗模拟
问题描述
我编写了一个程序来使用蒙特卡洛方法计算函数的定积分(比如 sin(x))。但是,我认为我使用 mt19937 的方式不对,或者代码中存在另一个问题,因为它没有返回预期的结果。
这是我的代码:
mt19937 RandomEngine(0);
uniform_real_distribution<double> RandomDouble(0.0,1.0);
double x = RandomDouble(RandomEngine);
int NumberOfSimulations;
cin >> NumberOfSimulations;
double SumOfValues=0;
for (int iSimulation = 0; iSimulation < (NumberOfSimulations -1 ); iSimulation++)
{
SumOfValues += sin(x);
}
SumOfValues /= NumberOfSimulations;
cout << "The integral's result is: " << SumOfValues << endl;
你能告诉我为什么输出甚至不准确吗?
解决方案
您的程序在 中抽取一个随机样本,double x = RandomDouble(RandomEngine);
然后重复添加其正弦值。
您需要在每次迭代中随机抽样。进入double x = RandomDouble(RandomEngine);
循环。
此外,for (int iSimulation = 0; iSimulation < (NumberOfSimulations -1 ); iSimulation++)
似乎使用了错误的界限。您对样本求和NumberOfSimulations-1
,然后除以NumberOfSimulations
。
推荐阅读
- javascript - 计算 click() 函数被使用了多少次
- version - 消费柯南最新版本
- r - 如何让 svglite 在 travis-ci 上渲染便携式 svg?
- python - django rest 框架 url 参数得到组合
- javascript - 能够处理 Symbol.iterator 和 for of 的 babel 和 parcel 所需的最低插件和设置
- javascript - 如何添加动态 div , react js
- android - 更改TextInputLayout 标题颜色
- javascript - highchart sunburst 百分比不是相对百分比,而是取决于其他属性
- php - 干预中使用的静态图像的正确位置
- python - Flask Routes 共享通用参数预处理