为什么我的程序不近似 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。
对于昨天的圆周率日,马特哈珀发布了一段视频,其中他通过将两个 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。