蒙特卡罗方法(Monte Carlo)
作者:互联网
蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法,是一个统称,很多方法可以归类于蒙特卡罗方法
Monte Carlo 不是“蒙特卡罗”发明的,它是地名,是摩纳哥一个小城,以赌闻名,号称“赌博之国”,它是由冯诺依曼,乌拉姆等人发明的
比较
- 拉斯维加斯 —— 尽量找最好的,但不保证能找到
假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。所以该算法必须是精确的那一个,相似的不行 - 蒙特卡罗 —— 尽量找好的,但不保证是最好的
比方说在美国大选,是选特朗普还是奥巴马,找人问是投给特朗普还是奥巴马,当找10个人的时候,会有很大的浮动,但寻找1000个人,10000个人,会发现概率会稳定在某个数值之间,这时候就得到了我们想要的结果。该算法是随着不断增加样本量,逐渐接近结果的过程
相关方法
- 蒙特卡罗算法,蒙特卡罗模拟,蒙特卡罗过程
- 蒙特卡罗搜索树
工作原理
- 不断抽样
- 逐渐逼近
(1) 圆周率Π值求解
python代码
import random
total = [10, 100, 1000, 10000, 100000, 500000] # 随着随即点数增大,越接近精确值
for cnt in total:
in_count = 0
for i in range(cnt):
x = random.random() # 返回随机生成的一个实数,它在[0,1)范围内
y = random.random()
dis = (x**2 + y**2)**0.5
if dis <= 1:
in_count += 1
print(cnt, '个随机点,Π是: ', 4 * in_count / cnt)
(2) 计算不规则图形面积
比如下面这张黑底图片,想要计算图中白色图形的面积,其中图形都是不规则图形,我们没办法通过边长公式等进行计算,其中一种方法就是可以通过蒙特卡罗方法,向图上随机打点,然后获取像素点所在的颜色,白色面积=白色点数/总点数×图片总面积(当然其实可以用计算机遍历所有像素点也可以求,但这里主要用来说明蒙特卡罗思想的方法)
python代码
import cv2
import random
img = cv2.imread('C:/Users/fly tree/Desktop/exp_img.png') # 读取图片,这里是绝对路劲
Width, Height = img.shape[:2]
total = [10, 100, 1000, 10000, 100000, 500000] # 随即点数
# print(dir(img))
for cnt in total:
in_count = 0
for i in range(cnt):
x = random.randint(0, Width-1)
y = random.randint(0, Height-1)
if img[x][y][0] == 255 and img[x][y][1] == 255 and img[x][y][2] == 255:
in_count += 1
print(cnt,'个随机点,白色面积为: ', Width * Height * in_count // cnt)
参考资料:
【智源学院】30分钟了解蒙特卡罗方法-有意思专题系列(蒙特卡洛方法)(Monte Carlo method)
标签:Monte,img,方法,random,cnt,蒙特卡罗,Carlo 来源: https://blog.csdn.net/weixin_45771864/article/details/117149527