蒙特卡洛简单的计算PI的值:
代码语言:javascript复制import random
import math
# import matplotlib
M = input('请输入一个较大的整数')
N = 0 # 累计落圆内的随机点的个数,初始值为零
for i in range(int(M)):
x = random.random() # 利用random()产生随机数或者是伪随机数
y = random.random()
if math.sqrt(x**2 y**2) < 1: # 判断产生的随机点是否落在单位圆内
N = N 1 # 对落在圆内的点进行累加
pi = 4*N/int(M)
# 这里是四分之一的圆,乘以4还原
print(pi)
正方形内部有一个相切的圆,它们的面积之比是π/4。现在,在这个正方形内部,随机产生n个点,计算它们与中心点的距离,并且判断是否落在圆的内部。若这些点均匀分布,则圆周率 pi = 4*N/int(M), 其中count表示落到圆内投点数 n:表示总的投点数。
1000次的结果
代码语言:javascript复制import random
n = int(input('请输入一个较大的整数')) # 要确保输入的整数足够大
m = 0
for i in range(n):
x = random.random()
y = random.random()
if x**2 > y: # 表示该点位于曲线y=x^2的下面
m = m 1
R = m/n
print(R)
1000次的定积分结果
蒙特卡洛求积分的原理:随机在矩形区域中随机获得一个随机数,
代码语言:javascript复制P(x,y)
if f(x)>y
count =1
执行N次,积分=矩形面积*count/N,具体的数学解答,我之后会写,这里就写一个实现就行,因为微信的公式排版不好。
代码语言:javascript复制import random
def cal():
"""经典的用蒙特卡洛方法求π值"""
n = 100000000
r = 1.0 # 假设圆的半径为1
a, b = (0.0, 0.0)
x_neg, x_pos = a - r, a r # 得到正方形的x取值范围
y_neg, y_pos = b - r, b r # 得到正方形的y取值范围
count = 0
for i in range(0, n):
x = random.uniform(x_neg, x_pos)
y = random.uniform(y_neg, y_pos)
if x * x y * y <= 1.0: # 确保坐标点(x,y)在圆形内,count变量 1
count = 1
print(count/n*4)
cal()
这个是改进版的计算PI,速度会快很多,所以参数空间到了1亿这个巨大的数字,我啥时候能有这么多的米。
代码语言:javascript复制100000000
迭代次数1亿次
这是我的CPU
代码语言:javascript复制https://github.com/bitcarmanlee/easy-algorithm-interview-and-practice
在这里链接中,给出了很多的笔记,大家可以来clone学习。
笔记一角