我已经创建了一个简单的Python程序,通过计算适合圆形内的1像素点数量来计算pi。一开始,我使用以下值运行程序:
from tkinter import *
tk = Tk()
canvas = Canvas(tk, width=400, height=400)
canvas.pack()
canvas.create_oval(100,100,400,400)
global pi_count
pi_count = 0
for x in range(100,400):
for y in range(100,400):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - 250)**2 + (fyc - 250)**2)**0.5
if dist > 150:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)
pi = (pi_count/150**2)
print(pi)
这给我输出了3.1412888889。
对于这个结果相对满意,我改变了椭圆的尺寸为 (100,100,500,500)
,并相应地改变了所有其他值(半径、循环等)。
然而,这个更大的圆形和可能更精确的面积产生了一个更不准确的估计值3.140675。
这是为什么?我该如何修正计算器以给出更精确的估计?
编辑
以下是已编辑和改进的代码,更易于测试:
from tkinter import *
MIN_POS = 100
MAX_POS = 300
center = (MAX_POS + MIN_POS)/2
radius = (MAX_POS - MIN_POS)/2
tk = Tk()
canvas = Canvas(tk, width=MAX_POS, height=MAX_POS)
canvas.pack()
canvas.create_oval(MIN_POS,MIN_POS,MAX_POS,MAX_POS)
global pi_count
pi_count = 0
for x in range(MIN_POS,MAX_POS):
for y in range(MIN_POS,MAX_POS):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - center)**2 + (fyc - center)**2)**0.5
if dist > radius:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)
pi = (pi_count/radius**2)
print(pi)
如果有一台快速的电脑可以按照100的步长提高Max_pos
值来运行此程序,我会非常感激。
250
,它可能来自于(100+400)/2
。 - Andras Deak -- Слава Україні