【问题标题】:It is about random choice in python这是关于python中的随机选择
【发布时间】:2013-08-17 05:37:59
【问题描述】:

我试图通过使用随机性代替概率的简单方式来创建 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

谁能告诉我为什么?

【问题讨论】:

  • 并不是说它回答了您的问题,而是您的程序在这两种情况下都近似于 2/0.64,而不是 pi。这与布冯的针无关。

标签: python random


【解决方案1】:

您的while 循环的条件是向后的。应该是:

while err > 0.1:

您还应该将err 设置为1.0 或高于0.1 的值。

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

err = abs(math.pi - re) / (math.pi)

【讨论】:

  • 您好 Blender 和 Antti Haapala 感谢您的建议。代码现在工作正常。我有更多问题,我将很快发布。再次感谢。
【解决方案2】:

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

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

【讨论】:

  • 好的。我会试试看。谢谢。
  • 不需要sys.float_info.max,只需使用float('+inf')
【解决方案3】:

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

如果您想要一种相对简单的 Monte Carlo 方法来估计 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2016-11-21
    • 2011-01-01
    • 2014-04-23
    • 2019-05-05
    相关资源
    最近更新 更多