蒙特卡罗方法是一种统计模拟方法,由冯·诺依曼和乌拉姆提出,在大量的随机数下,根据几率估计结果,随机数据越多,得到的结果越精确。下面咱们将用python实现蒙特卡罗方法。python
1.首先咱们作一个简单的圆周率的近似计算,在这个过程当中咱们要用到随机数,所以须要先使用import numpy as np
导入numpy库。dom
2.代码实现:工具
import numpy as np total = 8000000 count = 0 for i in range(total): x = np.random.rand() y = np.random.rand() dis = (x**2+y**2)**0.5 if dis <= 1: count = count+1 PI = 4*count/total print(PI)
3.在上面的程序中咱们用8000000个随机数进行投放,这样获得的结果会更精确一些,运行程序须要必定的时间,最终获得的结果以下编码
4.下面咱们进行一项简单的应用,下图为我在画图工具中随便画的一个图,咱们能够用蒙特卡罗方法来估算图中黑色部分的面积。spa
5.上面的图形是不规则的,咱们只需知道在投放大量随机数的状况下,随机数在黑色部分出现的几率,再用总面积相乘便可估算黑色部分的面积。咱们知道,黑色的rgb编码为(0,0,0),因此须要统计rgb编码为(0,0,0)时随机数的投放几率便可。code
6.代码实现:图片
from PIL import Image import numpy as np im = Image.open("C:/Users/21974/Desktop/handwrite2.PNG") total = 9000000 count = 0 defin = 0 width = im.size[0] height = im.size[1] for i in range(total): #用蒙特卡罗方法得到估计值 x = np.random.randint(0, width-1) y = np.random.randint(0, height-1) k = im.getpixel((x, y)) if k[0]+k[1]+k[2] == 0: count += 1 print(int(width*height*count/total)) for i in range(width): #用遍历得到准确值 for j in range(height): k = im.getpixel((i, j)) if k[0] + k[1] + k[2] == 0: defin += 1 print(defin)
上面的代码可分为两部分,第一个for后面是用蒙特卡罗方法得到的面积的估计值,第二个for后面是用遍历全部像素点的方法得到的面积的精确值,得到两个输出后进行对比。rem
咱们在上面的程序中采用了9000000个随机数,能够看出两个输出结果相差并不大。get