针对昨天的“圆周率日”,Matt Harper发布了一段视频,其中他通过掷500次两个120面骰子来近似计算圆周率(点击此处查看视频)。基本上,对于每组随机数,您需要检查它们是否互质。然后,使用以下公式进行计算:
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))