问题描述数学解法Python模拟
18世纪法国科学家Buffon提出的一种计算圆周率π的方法——随机投针法,就是用一枚普普通通的针就可以计算出圆周率 ,是不是很神奇,现在带着你的疑惑和我一探究竟吧。
平面上画着一些平行线,它们之间的距离都等于 ,向此平面任投一长度为 的针,试求此针与任一平行线相交的概率.
以 表示针的中点到最近的一条平行线的距离, 表示针与平行线的交角.针与平行线的位置关系如下图所示
显然有 ,以 表示边长为 及 的长方形.为使针与平行线相交,必须 ,满足这个关系式的区域记为 ,在图中用阴影表出,
所求的概率为
的面积的面积
由于最后的答案与 有关,因此不少人想利用它来计算 的数值,其方法是投针N次,计算针与线相交的次数n,再以频率作为概率p之值代入上式,求得
粗看这是一个笨办法,耗时费力,而且很难达到当时用数学方法已经算得小数点后一百多万位精确数值这样一个精度。但仔细思考会发现这是一个了不起的创意,他提出了一个全新的计算方案:建立一个概率模型,它与我们感兴趣的量 ——有关,然后设计随机试验,并通过实验结果来确定这些量。
历史上有不少实验者,下表给出有关资料
import numpy as np
def buffon(a,l,n):
# a为平行线之间的长度,n实验次数,l针的长度
k = 0
m = 2*l/a
x = np.random.uniform(low=0.0,high=l/2,size=n)
y = np.random.uniform(low=0.0,high=np.pi/2,size=n)
for i in range(n):
if x[i]<(a/2)*np.sin(y[i]):
k +=1
p = k/n
print('圆周率为:{}'.format(m/p))
buffon(1,0.8,1000000)
圆周率为:2.19752750686384