用布冯针法对 Pi 进行蒙特卡罗估计

计算科学 模拟
2021-12-24 04:15:41

有没有一种方法可以在不假设 Pi 已知的情况下使用 Buffon 的方法来估计 Pi?

更准确地说:在Buffon 发明的实验的 Monte Carlo 模拟中,我将(理想情况下)分别生成 2 个在 [0,1] 和 [0,Pi] 内均匀分布的随机数(这两个数是针的中心从条带的边缘和针的方向)。不幸的是,这是一种作弊,因为必须已经知道 Pi 的值才能生成角度。

一个可能的合理(至少在原则上)解决方案是通过在矩形中生成 2 个点来解决此问题,然后从中提取针的中心和方向的概率分布(施加固定长度的针)。然而,获得一些可用公式的分析计算对我来说似乎是一团糟。

有没有更聪明的方法呢?

3个回答

这是另一种游戏(代码在R; 希望它是可以理解的)。与 SeanD 的答案基本相同。

# from http://giventhedata.blogspot.com/2012/09/estimating-pi-with-r-via-mcs-dart-very.html
est.pi <- function(n){

# drawing in  [0,1] x [0,1] covers one quarter of square and circle.

# draw random numbers for the coordinates of the "dart-hits"
a <- runif(n,0,1)
b <- runif(n,0,1)
# use the pythagorean theorem
c <- sqrt((a^2) + (b^2) )
inside <- sum(c<1)
#outside <- n-inside
pi.est <- nside/n*4

 return(pi.est)
}

你为什么不检查它与曲线相交x2+y2=1,那是一个圆圈,你不需要知道π.

对于给定的(y,θ)配对你真的只需要决定是否y±12sinθ(端点)穿过一条线:

在此处输入图像描述

一种可能是采样sin(θ)直接,使用查找表或其泰勒级数到您关心的任何精度:

sin(x)=xx33!+x55!+

也就是说,你可以避免π以使用不统一的 PDF 为代价。画一对数字(y,y)在哪里y现在从正弦分布中采样。现在检查是否y±12y越过一条线。

当然,也有近似值π基于泰勒级数,所以它仍然有点鸡和蛋的问题......