首页 > 解决方案 > 使用均匀分布的随机数进行蒙特卡罗模拟

问题描述

我编写了一个程序来使用蒙特卡洛方法计算函数的定积分(比如 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;

你能告诉我为什么输出甚至不准确吗?

标签: c++montecarlo

解决方案


您的程序在 中抽取一个随机样本,double x = RandomDouble(RandomEngine);然后重复添加其正弦值。

您需要在每次迭代中随机抽样。进入double x = RandomDouble(RandomEngine);循环。

此外,for (int iSimulation = 0; iSimulation < (NumberOfSimulations -1 ); iSimulation++)似乎使用了错误的界限。您对样本求和NumberOfSimulations-1,然后除以NumberOfSimulations


推荐阅读