Noonisy
强化学习(七)
2022-09-18
阅读:310

蒙特卡罗法简介


蒙特卡罗法($Monte\ Carlo\ method$),是一种按抽样调查法求取统计值来推定未知特征量的计算方法。它的核心方法是通过构造一个和系统性能相近似的概率模型,使用随机数(或称伪随机)来大量重复随机采样,对采样结果进行统计分析得到数值结果,从而得到系统的随机特性

蒙特卡罗基本步骤

$Step\ 1$:构造或描述概率过程

构造一个概率过程,它的某些参量正好是所要求的问题的解。这一步通常要将不具有随机性质的问题转化为具有随机性质的问题

$Step\ 2$:实现从已知概率分布抽样

根据已知的概率分布进行大量的随机抽样

$Step\ 3$:对随机抽样结果进行统计分析

确定一些无偏估计量,它们对应着所要求的问题的解。利用抽样结果对这些无偏估计量进行估计,估计结果就是解的近似

案例:

利用蒙特卡罗法求解 $\pi$ 值,对于一个边长为 $L$ 的正方形,里面有一个内切的圆

圆

我们在这个正方形内投足够多的圆点,这些小圆点可能投在圆内,也可能投在阴影外的白色区域。假设一共投了 $N$ 个圆点,投在圆内的有 $K$ 个

图片1

(1). 概率过程

投点总数与投在圆内的点数之比应该约等于正方形面积与圆的面积之比
$$ \frac{N}{K}\approx \frac{L^2}{\pi(\frac{L}{2})^2} $$
故,可以得到:
$$ \pi\approx \frac{4K}{N} $$
那么可以代码求解
import random
import math

random.seed(0)  # 初始化随机数种子
n = 1000000     # 投点数
k = 0           # 落在圆内的点计数器
for _ in range(n):
    x1,x2 = random.random(),random.random()     # 随机生成一个点
    if math.sqrt(x1*x1+x2*x2)<=1:               # 如果点落在圆内
        k += 1 
print("pi = {:.10f}".format(4*k/n))
输出为
pi = 3.1424400000
如果将投点数增加,$\pi$ 的值会更加精确,但计算时间也会增加,例如改为n = 10000000,输出为
pi = 3.1413028000

参考

最后编辑于:2022 年 09 月 18 日 21:14
邮箱格式错误
网址请用http://或https://开头