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个随机数进行投放,这样得到的结果会更精确一些,运行程序需要一定的时间,最终得到的结果如下

python实现蒙特卡罗方法教程

4.下面我们进行一项简单的应用,下图为我在画图工具中随便画的一个图,我们可以用蒙特卡罗方法来估算图中黑色部分的面积。

python实现蒙特卡罗方法教程

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后面是用遍历所有像素点的方法获得的面积的精确值,获得两个输出后进行对比。

python实现蒙特卡罗方法教程

我们在上面的程序中采用了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
  • asp之家 网络编程 m.aspxhome.com