原理简介:
前提公式:S圆=Π*r^2
在一个边长为a的正方形内有一个内切圆,圆的面积为Π*(a/2)^2=Π*a^2/4,正方形面积为a^2,所以S圆/S正方形(记为x)=Π/4,所以Π=4*x。在一个正方形的区域内随机撒一定数量的黄豆,落在内切圆区域内的黄豆数量m可以看作内切圆的面积,而落在正方形内的黄豆数量n可以看作正方形的面积(即黄豆的总数量),所以Π=4*(m/n),现实生活中,正方形越大,撒豆数量越多,则计算出来的Π值越准确,反之越不准,而用编程语言则可以轻松解决这一弊端。
import random as rd
import math as m
import time as t
from numba import jit #使用jit十倍提升编译速度
t1=t.time()
#撒豆法计算Π
@jit
def pi_part(rn):
# rn=a*a #随机点个数,a为正方形边长
x=[rd.random() for i in range(rn)] #随机点的x向量
y=[rd.random() for i in range(rn)] #随机点的y向量
r=0.5 #正方形内切圆的半径
def pr(x,y): #随机点距离圆心的距离计算
return m.sqrt((r-x)**2+(r-y)**2)
def in_circle(pr,r): #随机点是否在圆内
if pr<=r:
return 1
else:
return 0
sum=0
for i in zip(x,y):
if in_circle(pr(i[0],i[1]),r)==1:
sum+=1
return sum
@jit
def pi():
sum=0
rn=100000000
size=10
for i in range(size):
sum+=pi_part(rn)
return 4*(sum/(rn*size))
print(pi())
t2=t.time()
print("cost:%0.5fs"%(t2-t1))
算法未优化,计算机性能有限,精确到第四位便差不多是极限了。。。