[英]Why doesn't my program approximate pi?
在昨天的Pi Day中,Matt Harper发布了一段视频,他通过滚动两个120面骰子500次来接近Pi( 见这里的视频 )。 基本上,对于每对随机数,您必须检查它们是否是互质的。 然后,公式
pi = sqrt(6/(n_coprimes/n_cofactors)) # EDIT: Wrong premise. Misremembered the formula.
计算。
他的结果大约是3.05,相当接近。
我想看看当完成更多滚动或随机整数范围增加时会发生什么。 有趣的是,无论我设置迭代次数或随机范围有多高,我的程序几乎总是给出3.05或接近它的结果。
这是我的计划。 我在Python 3.6(Win64)上运行它。 Python使用的随机数生成器应该是非常好的,所以也许我的程序中出错了?
import random
from math import gcd, sqrt
def pi(cp, cf):
return sqrt(6/(cf/cp)) # EDIT: Second error - switched numerator/denominator...
coprime = 0
cofactor = 0
iterations = 1000000
for i in range(iterations):
x = random.randint(0,1000000)
y = random.randint(0,1000000)
if gcd(x,y) > 1:
cofactor += 1
else:
coprime += 1
print(pi(coprime, cofactor))
我没看过视频,但你的公式错了。
当从N倾向于无穷大时,从1到N随机选取的两个整数是互质的概率趋于6 / pi ^ 2。 那是cp /(cf + cp)而不是cp / cf。
用这个替换你的pi
:
def pi(cp, cf):
fcp = cp / float(cp + cf)
return sqrt(6/fcp)
当我在我的机器上运行时给出3.14263472915。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.