蒙特卡罗算法

参考

MCMC(一)蒙特卡罗方法

蒙特卡罗方法是一类以概率统计理论为指导的数值计算方法。蒙特卡罗是一种随机算法,使用随机数(或者伪随机数)来解决计算问题,其思想是:当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。

蒙特卡罗方法解题过程

  1. 构造或描述概率过程
  2. 实现从已知概率分布抽样
  3. 建立估计量

蒙特卡罗方法计算圆周率

%  %总的实验次数  
%     n = input('请输入n:');  
%     %落在圆中点的次数  
%     m = 0;  
%     %使用的圆的直径
%     a = 2;  
%     %循环实验  
%     for i = 1:n  
%         x = rand * a / 2;  %产生随机数
%         y = rand * a / 2;  
%         if (x^2 + y^2 <= (a/2)^2)  
%             m = m + 1;  
%         end  
%     end  
%     %显示结果  
%     fprintf('当总实验次数n = %d时计算出来的圆周率:Pi = %d\n',n, 4 * m / n); 

利用蒙特卡罗积分求e

#include <iostream>
#include <iomanip>
using namespace std;

#define MAX_IETRS 1000000

struct Point
{
    double x;
    double y;
};
double Rand(double L, double R)
{
    return L + (R - L)*rand()*1.0 / RAND_MAX;
}
Point GetPoint()
{
    Point p;
    p.x = Rand(1.0, 2.0);
    p.y = Rand(0.0, 1.0);
    return p;
}
double GetResult()
{
    int m = 0;
    int n = MAX_IETRS;
    srand(time(NULL));
    for (int i=0;i<n;++i)
    {
        Point p = GetPoint();
        if (p.x*p.y <= 1.0) m++;
    }
    return pow(2.0, 1.0*n / m);
}
//////////////////////////////
int main()
{
    for (int i=0;i<20;++i)
    {
        cout << fixed << setprecision(6) << GetResult() << endl;
    }
    return 0;
}
View Code

 蒙特卡罗采样算法

参考: 蒙特卡罗方法采样算法

给定概率分布,利用计算机产生符合该分布的样本。

 

posted @ 2018-09-30 15:46  summer91  阅读(880)  评论(0编辑  收藏  举报