蒙特卡罗算法

蒙特卡罗算法

定义

  • 蒙特卡罗是一类随机方法的统称。这类方法的特点是,可以在随机采样上计算得到近似结果,随着采样的增多,得到的结果是正确结果的概率逐渐加大,但在(放弃随机采样,而采用类似全采样这样的确定性方法)获得真正的结果之前,无法知道目前得到的结果是不是真正的结果。

特点

  • 基于随机数
  • 统计模拟法
  • 拟蒙特卡洛算法在近几年也获得迅速发展。这种方法是用确定性的超均匀分布代替蒙特卡洛算法中的
    随机数序列,对于某些特定问题计算速度比普通的蒙特卡洛算法高几百倍。

对比

  • 拉斯维加斯算法
    尽量找最好的,但不保证能找到
  • 蒙特卡罗算法
    尽量找好的,但不保证是最好的

实现的三个步骤

  1. 构造描述概率过程
  2. 实现从已知概率分布抽样
    随机数是实现模拟的工具
  3. 建立各种估计量
    得到无偏估计

举例

clear
dt=1/365.0;                   % 一天的年单位时间
S0=20;                       % 股票在初始时刻的价格,程序中假设
r=0.031;                      % 期望收益率
sigma=0.6;                    % 波动率=0.6
expTerm=r*dt;                 % 漂移项dt
stddev=sigma*sqrt(dt);       % 波动项o:dz(t) 
nDays1=90;                    % 要模拟的总天数
for nDays=1:nDays1            % nDays表示时刻t
nTrials=10000;                % 模拟次数
for j=1:nTrials 
n = randn(1,nDays);           %生成nDays个标准正态分布随机数
S=S0; 
for i=1:nDays 
dS = S*(expTerm+stddev*n(i));   % 模拟计算股票价格的增量
S=S+dS;                      %计算股票价格
end
S1(nDays,j)=S;               % 将每天的股票模拟价格数据记录在S1中
end
end
S2=mean(S1');                 % 计算每天模拟的股票价格的均值,作为价格的估值 
plot(S2','-o')                    % 90天期间股票价格估值的曲线图
figure(2)
hist(S1(90,:),0:0.5:65)      %第90天的股票价格模拟的直方图
#include <bits/stdc++.h>

#define MAX_ITERS 1000000

using namespace std;

double Rand(double L, double R)
{
    return L + (R - L) * rand() * 1.0 / RAND_MAX;
}

double GetPi()
{
    srand(time(NULL));
    int cnt = 0;
    for(int i = 0; i < MAX_ITERS; i++)
    {
        double x = Rand(-1, 1);
        double y = Rand(-1, 1);
        if(x * x + y * y <= 1)
            cnt++;
    }
    return cnt * 4.0 / MAX_ITERS;
}

int main()
{
    for(int i = 0; i < 10; i++)
        cout << GetPi() << endl;
    return 0;
}
#include <bits/stdc++.h>

#define MAX_ITERS 10000000

using namespace std;

struct Point
{
    double x, y;
};

double Rand(double L, double R)  
{  
    return L + (R - L) * rand() * 1.0 / RAND_MAX;  
} 

Point getPoint()
{
    Point t;
    t.x = Rand(1.0, 2.0);
    t.y = Rand(0.0, 1.0);
    return t;
}

double getResult()
{
    int m = 0;
    int n = MAX_ITERS;
    srand(time(NULL));
    for(int i = 0; i < n; i++)
    {
        Point t = getPoint();
        double res = t.x * t.y;
        if(res <= 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;
}

原文地址:https://www.cnblogs.com/pprp/p/8397740.html