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检测远程udp端口是否打开的方法
Mar 14 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
django rest framework之请求与响应(详解)
Nov 06 Python
Python set常用操作函数集锦
Nov 15 Python
python使用Plotly绘图工具绘制气泡图
Apr 01 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
详解用python计算阶乘的几种方法
Aug 14 Python
Python 实现向word(docx)中输出
Feb 13 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
django使用多个数据库的方法实例
Mar 04 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
yii数据库的查询方法
2015/12/28 PHP
PHPMailer发送邮件
2016/12/28 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
不懂JavaScript应该怎样学
2008/04/16 Javascript
asp 取文本框名称代码
2008/12/02 Javascript
基于jQuery的Spin Button自定义文本框数值自增或自减
2010/07/17 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
2011/10/31 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
javascript如何判断输入的url是否正确
2014/04/11 Javascript
javascript实现数独解法
2015/03/14 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
jQuery+ajax+asp.net获取Json值的方法
2016/06/08 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
.NET常见笔试题集
2012/12/01 面试题
入伍通知书
2015/04/23 职场文书
golang 语言中错误处理机制
2021/08/30 Golang
python和Appium的移动端多设备自动化测试框架
2022/04/26 Python