python实现蒙特卡罗方法教程
作者:laozhang 时间:2023-01-29 16:36:02
蒙特卡罗方法是一种统计模拟方法,由冯·诺依曼和乌拉姆提出,在大量的随机数下,根据概率估计结果,随机数据越多,获得的结果越精确。下面我们将用python实现蒙特卡罗方法。
1.首先我们做一个简单的圆周率的近似计算,在这个过程中我们要用到随机数,因此需要先使用import numpy as np导入numpy库。
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.下面我们进行一项简单的应用,下图为我在画图工具中随便画的一个图,我们可以用蒙特卡罗方法来估算图中黑色部分的面积。
5.上面的图形是不规则的,我们只需知道在投放大量随机数的情况下,随机数在黑色部分出现的概率,再用总面积相乘即可估算黑色部分的面积。我们知道,黑色的rgb编码为(0,0,0),所以需要统计rgb编码为(0,0,0)时随机数的投放概率即可。
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后面是用遍历所有像素点的方法获得的面积的精确值,获得两个输出后进行对比。
我们在上面的程序中采用了9000000个随机数,可以看出两个输出结果相差并不大。
标签:python,蒙特卡罗
0
投稿
猜你喜欢
python爬虫解决验证码的思路及示例
2021-07-21 19:23:04
Python爬虫采集Tripadvisor数据案例实现
2022-01-28 14:54:28
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2022-11-30 20:40:01
python flask项目打包成docker镜像发布的过程
2021-06-28 17:38:21
用python 制作图片转pdf工具
2023-02-13 09:14:51
django中ImageField的使用详解
2023-09-28 03:58:37
Mysql复制表三种实现方法及grant解析
2024-01-13 06:03:23
asp xml 缓存类
2011-04-03 11:20:00
Python3写入文件常用方法实例分析
2023-08-24 14:44:53
使用Django和Postgres进行全文搜索的实例代码
2022-07-06 10:52:15
ajax请求get与post的区别总结
2024-04-29 13:58:25
Python+Selenium+Pytesseract实现图片验证码识别
2023-08-17 11:44:01
python 判断是否为正小数和正整数的实例
2022-06-12 01:26:04
利用anaconda保证64位和32位的python共存
2021-07-23 09:18:24
用JS找出字符串中出现次数最多的字母
2007-11-12 13:40:00
Python unittest单元测试openpyxl实现过程解析
2023-06-17 10:54:31
Python实现模拟分割大文件及多线程处理的方法
2021-08-26 10:55:12
解决python中os.system调用exe文件的问题
2023-11-29 14:46:13
如何基于Python实现电子邮件的发送
2022-03-16 11:49:16
go语言中的面向对象
2024-01-31 17:04:13