python实现蒙特卡罗方法教程


Posted in Python onJanuary 28, 2019

蒙特卡罗方法是一种统计模拟方法,由冯·诺依曼和乌拉姆提出,在大量的随机数下,根据概率估计结果,随机数据越多,获得的结果越精确。下面我们将用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 相关文章推荐
Python 文件重命名工具代码
Jul 26 Python
python多线程扫描端口示例
Jan 16 Python
python求解水仙花数的方法
May 11 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
点球小游戏python脚本
May 22 Python
python 实现图片旋转 上下左右 180度旋转的示例
Jan 24 Python
python程序变成软件的实操方法
Jun 24 Python
python安装scipy的方法步骤
Jun 26 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 #Python
python简单贪吃蛇开发
Jan 28 #Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 #Python
python使用正则筛选信用卡
Jan 27 #Python
pthon贪吃蛇游戏详细代码
Jan 27 #Python
只需7行Python代码玩转微信自动聊天
Jan 27 #Python
python实现贪吃蛇游戏
Mar 21 #Python
You might like
关于php循环跳出的问题
2013/07/01 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
php依赖注入知识点详解
2019/09/23 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
学习ExtJS fit布局使用说明
2009/10/08 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
JavaScript获取页面中表单(form)数量的方法
2015/04/03 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
2016/05/20 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
2019/05/30 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
Python中操作符重载用法分析
2016/04/29 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
用Python编写一个高效的端口扫描器的方法
2018/12/20 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
python中entry用法讲解
2020/12/04 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
大学生四年生活自我鉴定
2013/11/21 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
学校文明单位申报材料
2014/05/06 职场文书
写求职信有哪些注意事项
2014/05/08 职场文书
财产分割协议书范本
2014/11/03 职场文书
银行求职信怎么写
2019/06/20 职场文书
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
Nginx缓存设置案例详解
2021/09/15 Servers
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android