【问题标题】:Monte Carlo Simulation using uniformly distributed random numbers使用均匀分布的随机数进行蒙特卡罗模拟
【发布时间】:2020-11-14 15:20:47
【问题描述】:

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

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

【问题讨论】:

  • 当询问现有代码有什么问题时,提供minimal reproducible example,包括完整的程序(显示#include 语句、main 的定义以及编译和运行所需的所有其他内容) , 演示问题的示例输入、观察到的输出和预期输出。

标签: c++ montecarlo


【解决方案1】:

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

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

此外,for (int iSimulation = 0; iSimulation &lt; (NumberOfSimulations -1 ); iSimulation++) 似乎使用了错误的界限。您将 NumberOfSimulations-1 样本相加,然后除以 NumberOfSimulations

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多