为什么我的程序不近似 pi?

Why doesn't my program approximate pi?

对于昨天的圆周率日,马特哈珀发布了一段视频,其中他通过将两个 120 面的骰子掷 500 次来近似圆周率 (see the video here)。基本上,对于每对 运行dom 数,您必须检查它们是否互质。那么,公式

pi = sqrt(6/(n_coprimes/n_cofactors))   # EDIT: Wrong premise. Misremembered the formula.

计算出来的。

他的结果大约是 3.05,相当接近。

我想看看当完成更多掷骰或 运行ge 的 运行dom 整数增加时会发生什么。有趣的是,无论我将迭代次数或 运行dom 运行ge.

设置多高,我的程序几乎总是给出 3.05 或接近它的结果

这是我的程序。我 运行 它在 Python 3.6 (Win64) 上。 运行dom 数字生成器 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))

我没看过视频,但是你的公式是错误的。

从1到N随机选取的两个整数互质的概率趋于6/pi^2,因为N趋于无穷大。那是 cp/(cf + cp) 而不是 cp/cf.

将您的 pi 替换为:

def pi(cp, cf):
    fcp = cp / float(cp + cf)
    return sqrt(6/fcp)

当我在我的机器上 运行 时给出 3.14263472915。