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基础教程之简单入门说明(变量和控制语言使用方法)
Mar 25 Python
Python中read()、readline()和readlines()三者间的区别和用法
Jul 30 Python
Python3 处理JSON的实例详解
Oct 29 Python
Python3 实现文件批量重命名示例代码
Jun 03 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
Python中有几个关键字
Jun 04 Python
Django admin组件的使用
Oct 24 Python
Python GUI库Tkiner使用方法代码示例
Nov 27 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数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php命名空间学习详解
2014/02/27 PHP
ThinkPHP页面跳转success与error方法概述
2014/06/25 PHP
php设计模式之委托模式
2016/02/13 PHP
PHP会话控制实例分析
2016/12/24 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
JavaScript计时器示例分析
2015/02/05 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
javascript闭包功能与用法实例分析
2017/04/06 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
python实现最长公共子序列
2018/05/22 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
C语言笔试题
2014/09/04 面试题
市场总经理岗位职责
2014/04/11 职场文书
活动总结格式
2014/08/30 职场文书
银行奉献演讲稿
2014/09/16 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
2015年环卫工作总结
2015/04/28 职场文书
2019年幼儿园家长接送责任书
2019/10/29 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
详解Vue的options
2021/05/15 Vue.js