蒙特卡洛方法

蒙特卡洛方法

理解:是一种利用大量样本与样本中正确数量形成的概率去逼近真实值的一种方法。

可以很巧妙的求取某些问题:如 π 的值

1、利用蒙特卡洛方法求π

我们知道圆的面积公式是:π * r * r

那么 1 / 4 圆的面积就是 1/ 4 *π * r * r

此时我们有这么一个边长为 1 的正方形、又有一个半径为 1 的圆,让 1 / 4 的圆放在这个正方形中:如下图

然后、此时我们随机的在正方形区域打点:

在这里插入图片描述

我们可以知道、点可能落在圆内,也可能在圆外、那么当打点次数足够多时,是完全有可能将正方形每一个地方都打点、那么在正方形中 1 / 4 圆的面积就应该是:正方形的面积 * 点打在圆内的概率。

也就是说 :

​ 1 / 4 圆的面积 = 正方形的面积 * 打在圆内点数量 / 全部点数量

即:(假设圆半径、正方形边长都为 1、打在圆内点数量为 count_y 、总点数为 : count )

​ 1/ 4 *π * 1 * 1 = 1 * 1 * count_y / count

简化为:

​ π = 4 * count_y / count

即:我们只需要求出点打在圆内的概率就能知道 π 的值。

那么:怎么知道点是打在圆内呢?

通过 点 到 圆心的长度与圆半径比较即可。

且 点打的越多、概率越逼近此正方形内 1/4圆 与 正方形 面积的比值,即真实的π值

上代码!

from random import random

# 假设正方形边长、圆半径都为1、
countall = 10000000 # 总点数
count_y = 0 # 在圆内点数

for i in range(countall):
    x = random() # 因为此随机数范围正好在 0~1,符合正方形边长、所以获取的 x,y就相当于在正方形中随机的一个点
    y = random()
    # 判断这个点在不在圆内
    if pow((x * x + y * y), 0.5) < 1:
        count_y += 1

print("当点数为:"+str(countall)+" 时、π值为:"+str(4 * count_y / countall))

结果:
当点数为 100 时、π值为:3.16
当点数为:10000 时、π值为:3.1164
当点数为:1000000 时、π值为:3.143912
当点数为:10000000 时、π值为:3.1412768
当点数为:100000000 时、π值为:3.14212396

可以看到、当次数足够多时、最后计算 π 的值是越逼近真实值的、但是既然是概率作为驱动、所以每一次的值不可能一样、甚至可能出现次数太多反而没那么精确(可能是次数还不够、但是一亿次啊喂、再多电脑就跑太久了)

最后:不只是可以用来计算 π ,比如说一张不规则图片、分 白。黑两色、求白色面积、此时依旧可以使用此方法判断落点处颜色与整体落点数进而求面积

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值