蒙特卡洛方法的名字来源于摩纳哥的一个城市蒙特卡洛,该城市以赌博业闻名,而蒙特卡洛方法正是以概率为基础的方法。

蒙特卡洛方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。

当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。有一个例子可以使你比较直观地了解蒙特卡洛方法:

假设我们要计算一个不规则图形的面积,那么图形的不规则程度和分析性计算(比如,积分)的复杂程度是成正比的。蒙特卡洛方法是怎么计算的呢?假想你有一袋豆子,把豆子均匀地朝这个图形上撒,然后数这个图形之中有多少颗豆子,这个豆子的数目就是图形的面积。当你的豆子越小,撒的越多的时候,结果就越精确。在这里我们要假定豆子都在一个平面上,相互之间没有重叠。

根据上面的思想,我们来求算圆周率。假设有半径为 R 的圆,其面积为 πR^2,则其外接正方形边长为 2R,面积为 4R^2 。假设向这个由正方形和圆组成的图形中随机扔豆子,扔的次数为 N ,落入圆中的次数为 n ,则根据面积比例,有:

πR^2 / 4R ^ 2 ≈ n / N

注意这里是约等于。根据概率论,当 N 越大时,则上面左右两边的差值会越小,这样,圆周率π,可以使用下式来逼近:

π ≈ 4 * n / N

我们使用 Python 语言将上面算法实现:

from __future__ import division

import random

import time

num = 1

for j in range(2, 100000):

startT = time.clock()

# 落入圆内计数

counter = 0

# 往正方形中扔了 10 的 j 次方次

for i in range(10 ** j):

x = random.uniform(-1, 1)

y = random.uniform(-1, 1)

# 落入了圆内

if x**2 + y**2 < 1:

counter = counter + 1

endT = time.clock()

print ( num)

print ( 'pi:{0}'.format(4 * (counter / 10 ** j)))

print ( 'Time:{0}'.format(endT - startT))

print ('')

num += 1

尽管可以使用上面代码来计算π,但是实际的计算速度是很慢的(当然还可以使用扩展库或 ctypes 进行优化)。而且,计算机产生的随机数只能精确到某位数,并不能产生任何实数(例如无理数等等),即使取10的9次方个随机点时,其结果也仅在前4位与圆周率吻合。

python蒙特卡洛方法圆周率_使用Python语言的蒙特卡洛方法计算圆周率π的一种实现...相关推荐

  1. C语言通过傅里叶展开式计算圆周率PI的代码

    把做工程过程比较重要的一些代码段记录起来,下面的代码是关于C语言通过傅里叶展开式计算圆周率PI的代码. #include #include <math.h> using namespace ...

  2. python语言公式求圆周率_通过Python实现圆周率的计算(公式方法和蒙特卡罗方法)...

    1.通过公式计算圆周率 当k正无穷 π=[1/16^k*(4/(8*k+1)-2/(8*k+4)- 1/(8*k+5)-1/(8*k+6))] 实现如下 #cal pi = 0 N = 100 for ...

  3. 用python计算圆周率_用python计算圆周率π

    原博文 2020-03-22 15:32 − 用python计算圆周率π 一.要求 1.要起义能计算到圆周率后面越多位越好. 2.用进度条显示计算的进度,能给出越多种进度条越好. 3.要求给出圆周率π ...

  4. python求同构数_用c语言求1到1000的同构数_后端开发

    python与平台有关吗_后端开发 Python与平台无关,因为Python是跨平台的语言,Python作为脚本语言,是解释执行的,所以能跨平台,前提是必须要有一个对应的解释器. 具体请看实例: py ...

  5. java方法重载_在Python中该如何实现Java的重写与重载

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:清风python PS:如有需要Python学习资料的小伙伴可以加点击 ...

  6. python写一个类方法_重写python脚本,在脚本的每个类中注入一个方法 - python

    假设我有一个python模块foo.py,其中包含: class Foo(object): def __init__(self): pass 接下来,我想解析此脚本,并在每个类中注入一个方法,然后将其 ...

  7. python词汇网络流行语_流水的语言,铁打的Python!

    "流水的语言,铁打的 Python" 一.Python 对新手极其友好 二.Python 具备大数据处理能力 三.Python 拥有惊人数量的库 四.Python 可靠并且高效 五 ...

  8. python移动端爬虫_移动端爬虫工具与方法介绍

    本文来自网易云社区 作者:王涛 本文主要介绍了移动端爬虫的工具与方法,作为一个入门的大纲.没有详细介绍的也给出了本人学习过程中借鉴的资料的链接,适合对移动端爬虫感兴趣的同学入门. 一.抓包模拟 基本原 ...

  9. python手机app开发_利用python开发app实战的方法

    我很早之前就想开发一款app玩玩,无奈对java不够熟悉,之前也没有开发app的经验,因此一直耽搁了.最近想到尝试用python开发一款app,google搜索了一番后,发现确实有路可寻,目前也有了一 ...

  10. python 客户端应用程序_创建python Web服务和C#客户端应用程序的最佳方法 - c#

    我正在寻找一种简单可靠的方法来创建Python Web Service并从.Net(c#)应用程序中使用它. 我发现了很多不同的库,其中一个库比另一个库好,但是似乎没有人提供关于Python Web ...

最新文章

  1. php分页不跳转,分页源代码,分页时上一页下一页不显示,但可以跳转
  2. linux查找技巧: find grep xargs linux系统信息查看大全
  3. Play 1.x框架学习之六:未登陆拦截机制 (Not Login intercept In play framework)
  4. UEBA 学术界研究现状——用户行为异常检测思路:序列挖掘prefixspan,HMM,LSTM/CNN,SVM异常检测,聚类CURE算法...
  5. 怎样实现关闭connection时自动关闭Statement和ResultSet
  6. uirecorder 启动webdriver服务报错
  7. linux目录所属用户和组,管理用户所属的用户组《 Linux 文件与目录权限 》
  8. Java并发编程的基础-Thread.interrupted
  9. require.js学习记录
  10. win8升级win10出现错误代码1049怎么回事
  11. 小米MIX4不会采用四曲面屏:结果未必是坏事
  12. GDI+入门(5、在GDI+中绘制带动画效果的图片)
  13. 仅需8道题轻松掌握Python Web应用开发 | Python技能树征题
  14. 当心DevOps虚假指标
  15. php随机经纬度,PHP轻松实现附近的人功能,根据IP确定经纬度,根据经纬度计算距离...
  16. win10系统事件查看器如何打开 Win10事件查看器怎么使用
  17. python三种运算符_Python 海象运算符 (:=) 的三种用法
  18. Neo4j使用方法总结
  19. Kafka SCRAM和PLAIN权限认证
  20. 3 个节省时间的 Python 技巧!

热门文章

  1. echarts实现3D地球模式--3D线和标记mark
  2. PSP自制程序打包ISO方法及注意事项
  3. 优秀站长工具推荐之百度统计热力图用户体验要素
  4. 谈一谈Normalize.css
  5. RouterOS如何实现多线路带宽叠加功能
  6. Kali-WIFI攻防(三)----wifite自动化WEP/WPA破解工具
  7. 11.2.1 绝对值函数
  8. AndroidStudio
  9. 慌乱的表情,泄露了我的悲伤:伤感心情日志
  10. python写整数逆位运算_整数逆位运算