蒙特卡罗方法(Monte Carlo method)

蒙特卡罗方法是由冯诺依曼和乌拉姆等人发明的,“蒙特卡罗”这个名字是出自摩纳哥的蒙特卡罗赌场,这个方法是一类基于概率的方法的统称,不是特指一种方法。与它对应的是确定性算法。
蒙特卡罗方法也称为统计模拟方法,是指使用随机数(或者更常见的伪随机数)来解决很多计算问题的方法。工作原理就是:不断抽样、逐渐逼近。

通常蒙特卡罗方法可以粗略地分成两类:

一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。

另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或者随机变量的期望值。

求π

image.png

r=1
s=πr2=π

如图所示,有一个半径为r=1的圆和边长为1的正方形

圆的面积为:s=πr2=π
正方形的面积s正=1
正方形内相切圆的面积为整个圆的¼,即蒙特卡罗法 - 图2

然后我们向正方形中随机打点,就会有一定的概率落在圆中:
image.png

所以我们就认为 点 落入圆弧内部的概率=圆弧的面积/正方形的面积
=π/4/1
=π/4

π=落入圆弧内部的概率*4

  1. #π=概率*4
  2. #1.打点
  3. import random
  4. total=[5,100,1000,10000,100000,5000000]#总共的点数
  5. for i in total:
  6. in_count = 0 # 在圆内部点的数量
  7. for j in range(i):
  8. x = random.random() # 从x=0,y=0遍历生成随机数random是0~1
  9. y = random.random()
  10. dis=(x**2+y**2)**0.5# 点到圆心的距离 根号下x^2+y^2
  11. if dis<=1:
  12. in_count+=1
  13. print("π是:{0}".format(4*in_count/j))

image.png

当点数越多,那么越接近于π值

计算不规则图形面积

比如下面这张黑底图片,想要计算图中白色图形的面积,其中图形都是不规则图形,我们没办法通过边长公式等进行计算,其中一种方法就是可以通过蒙特卡罗方法,向图上随机打点,然后获取像素点所在的颜色,白色面积=白色点数/总点数*图片总面积(当然其实可以用计算机遍历所有像素点也可以求,但这里主要用来说明蒙特卡罗思想的方法)
image.png

  1. from PIL import Image
  2. import random
  3. img = Image.open('monte.png') #读取图片
  4. total = [10, 100, 1000, 10000, 100000, 1000000, 5000000] #随机点数
  5. for t in total:
  6. in_count = 0
  7. for i in range(t):
  8. x = random.randint(0, img.width-1)
  9. y = random.randint(0, img.height-1)
  10. if img.getpixel((x,y))==(255,255,255,255): #数据输出格式:(R, G, B, A)
  11. in_count += 1
  12. print(t,'个随机点时,白色面积为:', int(img.width*img.height*in_count/t))

参考如下:

https://zhuanlan.zhihu.com/p/369099011