文章目录
0x00 前言
蒙特卡罗法也称统计模拟法、统计试验法。是把概率现象作为研究对象的数值模拟方法。是按抽样调查法求取统计值来推定未知特性量的计算方法。蒙特卡罗是摩纳哥的著名赌城,该法为表明其随机抽样的本质而命名。故适用于对离散系统进行计算仿真试验。在计算仿真中,通过构造一个和系统性能相近似的概率模型,并在数字计算机上进行随机试验,可以模拟系统的随机特性。
0x01 问题分析
![](https://img-blog.csdnimg.cn/img_convert/4893543c6931d6fe02f987f7ab6c0139.gif)
如图所示,是一个正方形使用蒙特卡罗方法求圆周率的值,方法是向正方形中随机打点,就会有一部分随机点数落在半圆中。这样通过落到圆中的随机点数就是圆的面积,而整个正方形的所有随机点数就是正方形面积。通过随机点数的数量与整个圆方形中的所有随机点数量的比值就能够计算出圆的面积。
0x02 代码设计
from random import random
from time import perf_counter
代码解析:from 是导入一个库中的一个函数,导入 random 库中的 random 函数,random() 函数可以随机生成一个实数,它在[0,1)范围内。导入 time 库中的 perf_counter 函数,perf_counter() 函数可以返回性能计数器的值,可以用作程序计时。
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
代码解析:定义变量 DARTS 设置为1000*1000为正方形区域内的随机点总数;定义变量 hits 设置0.0为初始值,表示在圆内部的随机点数量;定义变量 start 把当前程序时间保存到变量 start 中。
for i in range(1,DARTS+1):
x,y = random(),random()
dist = pow(x ** 2 + y ** 2,0.5)
if dist <= 1.0:
hits += 1
代码解析:使用 for 循环来模拟蒙特卡罗方法对所有随机点数随机撒点,(1,DARTS+1) 表示循环次数。使用 random() 函数生成随机数赋值给变量 x 和 y 。使用 pow() 函数计算 x²+y² 的开方值,并用 if 判断如果小于等于1.0,说明这个点在圆的内部,就将 hits 的值加1。
pi = 4 * (hits/DARTS)
代码解析:通过计算圆内部随机点的数量除以正方形区域内随机点的总数乘4,即可得到 pi 的值。
print("圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter()-start))
代码解析:使用 format() 来打印 pi 值,同样使用 format() 来打印运行时间。其中:.5f 表示保留五位小数,perf_counter()-start表示程序最后运行的系统时间减去程序开始运行的系统时间。
0x03 代码流程
![](https://img-blog.csdnimg.cn/7b35269a363647bb8ed7fe94de4085be.png)
0x04 完整代码
#Monte Carlo method.py
from random import random
from time import perf_counter
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
for i in range(1,DARTS+1):
x,y = random(),random()
dist = pow(x ** 2 + y ** 2,0.5)
if dist <= 1.0:
hits += 1
pi = 4 * (hits/DARTS)
print("圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter()-start))
0x05 运行效果
圆周率值是:3.139432
运行时间是:0.73480s
Process finished with exit code 0
0x06 参考文献
[1].集智百科. 蒙特卡罗模拟[EB/OL]. 2021-12-21[2022-09-14]. https://wiki.swarma.org/index.php/%E8%92%99%E7%89%B9%E5%8D%A1%E7%BD%97%E6%A8%A1%E6%8B%9F.
[2].石溪. 机器学习中的数学:概率统计[EB/OL]. 2021-06-02[2022-09-14]. https://www.zhihu.com/question/441076840#:~:text=%E8%92%99%E7%89%B9%E5%8D%A1%E7%BD%97%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5,%E5%9B%BE%E5%83%8F%EF%BC%8C%E9%9D%9E%E5%B8%B8%E6%9C%89%E6%95%88%E3%80%82.
0x07 总结
文章内容为学习记录的笔记,由于作者水平有限,文中若有错误与不足欢迎留言,便于及时更正。