1

我试图通过一种简单的方式使用随机性来代替概率来创建 Buffoon 的针实验。pi 的值可以从等式 pi = 2*ln/th 中找到,其中 l = 针的长度,n = 针落下的次数,t = 线的宽度,h = 针穿过线的次数。我假设 l = t 从而将我的方程简化为 pi = 2*n/h。现在我做了两个代码。代码 1:

import math, random
h = 0.0
n = 0.0
for i in range(0,10000):
    a = random.random()
    if a > 0.64:
        h = h+1
    else:
        n = n+1
re = 2*(n+h)/n
print "Value of pi is ", re
err = (math.pi - re)*100/(math.pi)
print "Percentage error is  ", abs(err)

现在这个运行良好,给了我足够好的结果。但是下面的代码一遍又一遍地重复相同的答案。代码 2:

import random, time, math
h=1.0
n=1.0
err = 0.0
while err < 0.1:
    a = random.random()
    if a > 0.64:
        h = h+1
    else:
        n = n+1
    re = 2*(n+h)/n
    err = (math.pi - re)*100/(math.pi)
print "Number of attempts is ", n+h

谁能告诉我为什么??

4

3 回答 3

0

其他人指出了您的停止标准存在问题,但您的代码有一个更根本的缺陷。这不是布冯的针刺实验。您已经找到了一种稍微复杂的方法来计算比率 2.0 / 0.64。如果您反复运行程序并对结果进行平均,您会发现平均值收敛到 3.125,而不是 Pi。Buffon 的实验是基于针是否穿过一组平行线中的一条,这取决于针中心的位置和它下落的角度,您的程序中都没有考虑到这两者。

如果您想要一种相对简单的蒙特卡罗方法来估计 Pi,请在以 (0,0) 为中心的 2x2 正方形上随机生成点,然后查看这些点中有多少比例落在具有单位半径的内接圆内。该比例应该与两个区域的比例 Pi / 4 相同,因此将估计的比例乘以 4 可以得出一个不错的 Pi 估计值。在伪代码中:

count = 0
repeat N times
  x <- U(-1,1)
  y <- U(-1,1)
  if x^2 + y^2 <= 1
    increment count
pi_est <- 4 * count / N

whereU(-1,1)表示生成一个介于 -1 和 1 之间的值。

于 2013-08-17T18:53:17.667 回答
0

你的while循环条件是倒退的。它应该是:

while err > 0.1:

您还应该设置err1.0或高于0.1.

最后,在计算误差时,您应该使用abs

err = abs(math.pi - re) / (math.pi)
于 2013-08-17T05:40:00.607 回答
0

您希望错误在开始时尽可能大,然后循环直到它变得足够小。利用

import sys

error = sys.float_info.max
epsilon = 0.1
while err > epsilon:
    ...

此外,通常差异也可能是负数,因此要获得错误,您需要使用 abs 来仅比较幅度。因此我们得到了一个更惯用的程序

import random, time, math
import sys

h = n = 1.0
err = sys.float_info.max
epsilon = 0.001

while err > epsilon:
    a = random.random()
    if a > 0.64:
        h += 1
    else:
        n += 1

    re = 2 * (n + h) / n
    err = abs((math.pi - re) / math.pi)

print "Value of pi is ", re
print "Number of attempts is ", n + h
于 2013-08-17T05:42:07.807 回答