蒙特卡罗方法(Monte Carlo)

蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于"随机数"的计算方法,是一个统称,很多方法可以归类于蒙特卡罗方法

Monte Carlo 不是“蒙特卡罗”发明的,它是地名,是摩纳哥一个小城,以赌闻名,号称“赌博之国”,它是由冯诺依曼,乌拉姆等人发明的

比较

  • 拉斯维加斯 —— 尽量找最好的,但不保证能找到
    假如有一把锁,给我100把钥匙,只有1把是对的。于是我每次随机拿1把钥匙去试,打不开就再换1把。我试的次数越多,打开(最优解)的机会就越大,但在打开之前,那些错的钥匙都是没有用的。所以该算法必须是精确的那一个,相似的不行
  • 蒙特卡罗 —— 尽量找好的,但不保证是最好的
    比方说在美国大选,是选特朗普还是奥巴马,找人问是投给特朗普还是奥巴马,当找10个人的时候,会有很大的浮动,但寻找1000个人,10000个人,会发现概率会稳定在某个数值之间,这时候就得到了我们想要的结果。该算法是随着不断增加样本量,逐渐接近结果的过程

相关方法

  • 蒙特卡罗算法,蒙特卡罗模拟,蒙特卡罗过程
  • 蒙特卡罗搜索树

工作原理

  • 不断抽样
  • 逐渐逼近

(1) 圆周率Π值求解

python代码

import random

total = [10, 100, 1000, 10000, 100000, 500000, 1000000]  # 随着随即点数增大,越接近精确值

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)

我的测试结果:

10 个随机点,Π是:  2.8
100 个随机点,Π是:  3.16
1000 个随机点,Π是:  3.108
10000 个随机点,Π是:  3.0944
100000 个随机点,Π是:  3.146
500000 个随机点,Π是:  3.139232
1000000 个随机点,Π是:  3.143212

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

命名为exp_img.png

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, 1000000]  # 随即点数
# 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)

我的测试结果:

10 个随机点,白色面积为:  29603
100 个随机点,白色面积为:  32563
1000 个随机点,白色面积为:  26642
10000 个随机点,白色面积为:  29958
100000 个随机点,白色面积为:  29434
500000 个随机点,白色面积为:  29616
1000000 个随机点,白色面积为:  29514

正确的结果:

import cv2
img = cv2.imread('C:/Users/fly tree/Desktop/exp_img.png')  # 读取图片,这里是绝对路劲
Width, Height = img.shape[:2]

cnt = 0
for x in range(Width):
    for y in range(Height):
        if img[x][y][0] == 255 and img[x][y][1] == 255 and img[x][y][2] == 255:
            cnt += 1

print(cnt)  # 29530

参考资料:
[智源学院] 30分钟了解蒙特卡罗方法-有意思专题系列(蒙特卡洛方法)(Monte Carlo method):
https://www.bilibili.com/video/BV1Gs411g7EJ?share_source=copy_web

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.DoubleBean.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值