![3009a95f52e4ad37a5c76a3526b2f024.png](https://img-blog.csdnimg.cn/img_convert/3009a95f52e4ad37a5c76a3526b2f024.png)
蒙特卡罗方法是指用随机数通过求解概率而获得近似值的方法。而圆周率也可通过此法求解。
![1bc8755f78c1e75c998dcf5c603e722c.png](https://img-blog.csdnimg.cn/img_convert/1bc8755f78c1e75c998dcf5c603e722c.png)
一、蒙特卡罗方法
![32f8204c860816897b4b791c713e1c90.png](https://img-blog.csdnimg.cn/img_convert/32f8204c860816897b4b791c713e1c90.png)
假设有一个圆,
- 半径:
- 圆的面积:
- 方的面积:
那么,圆在方里的概率为:
模拟方法
通过上述公式,转换得
其中,
- m为圆内点的个数;
- n为圆外点的个数。
需要检验某个点是否在圆内,可通过公式得知:
其中
二、蒙特卡罗模拟
2.1. 程序定义
变量
- m:整数,落入圆内的点的个数
- n:整数,落中圆外的点的个数
- x:浮点数,居于(0,1)区间的随机数
- y:浮点数,居于(0,1)敬意的随机数
- r:浮点数,圆半径
-
:浮点数,圆周率
算法
如果某一点(x, y),并且x,y分别在区间(0, 1)内,满足
则在圆内,否则在圆外。
重复试验n次,求得圆周率有:
2.2. 模拟过程
用Python模拟的过程如下:
import math
import random
def simulator(n):
n_in_a_circle = 0
for i in range(n):
# random.().random(): (0, 1)
x = random.random()
y = random.random()
if math.sqrt(x*x + y*y) < 1:
n_in_a_circle += 1
return n_in_a_circle
def compute_pi(n_in_a_circle, n_in_a_square):
return 4 * n_in_a_circle / n_in_a_square
求得结果:
n = 1000000
m = simulator(n)
pi = compute_pi(m, n)
print(pi)
----------------------------
3.141792
多次试验,圆周率随试验次数增多的变化规律如下:
![d90a48b76466cbb2de76f39be2bfc371.png](https://img-blog.csdnimg.cn/img_convert/d90a48b76466cbb2de76f39be2bfc371.png)
![4d57887aa5dd018ab4f14a5426bc949c.png](https://img-blog.csdnimg.cn/img_convert/4d57887aa5dd018ab4f14a5426bc949c.png)