蒙特卡罗算法
参考
MCMC(一)蒙特卡罗方法
蒙特卡罗方法是一类以概率统计理论为指导的数值计算方法。蒙特卡罗是一种随机算法,使用随机数(或者伪随机数)来解决计算问题,其思想是:当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。
蒙特卡罗方法解题过程
- 构造或描述概率过程
- 实现从已知概率分布抽样
- 建立估计量
蒙特卡罗方法计算圆周率
% %总的实验次数 % 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; }
蒙特卡罗采样算法
参考: 蒙特卡罗方法采样算法
给定概率分布,利用计算机产生符合该分布的样本。