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

Tim*_*ker 7 python random pi

在昨天的Pi Day中,Matt Harper发布了一段视频,他通过滚动两个120面骰子500次来接近Pi(见这里的视频).基本上,对于每对随机数,您必须检查它们是否是互质的.然后,公式

pi = sqrt(6/(n_coprimes/n_cofactors))   # EDIT: Wrong premise. Misremembered the formula.
Run Code Online (Sandbox Code Playgroud)

计算.

他的结果大约是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))
Run Code Online (Sandbox Code Playgroud)

Pau*_*kin 10

我没看过视频,但你的公式错了.

当从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)
Run Code Online (Sandbox Code Playgroud)

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