为何用非随机圆周行走法生成的是2*sqrt(2)而非π?
问题:为何用步进逼近圆周的方法得到的是2√2而非π?
我尝试通过沿90度圆周路径在x或y方向每次移动一步的方式计算π,完成后通过除以半径得到结果,但始终得到2.8而非3.14。
代码
import math circ=1 res=1000000 x=res y=0 while x>=y: circ=circ+1 ops=[] ops.append(abs(res**2 - (x-1)**2 - (y+0)**2)) ops.append(abs(res**2 - (x-0)**2 - (y+1)**2)) ops.append(abs(res**2 - (x-1)**2 - (y+1)**2)) ops.append(abs(res**2 - (x+1)**2 - (y+1)**2)) ops.append(abs(res**2 - (x-1)**2 - (y-1)**2)) o= ops.index(min(ops)) #print(o,ops) if o==0: x=x-1 if o==1: y=y+1 if o==2: x=x-1; y=y+1 if o==3: x=x+1; y=y+1 if o==4: x=x-1; y=y-1 print(x,y) print() print(circ*4/res)
输出
707106 707108 2.828436 [Program finished]
原因分析
你的算法没有在逼近四分之一圆周,而是在逼近从(res,0)到(res/√2, res/√2)的直线段,最终结果自然是2√2而非π,具体问题点如下:
- 循环条件错误:
while x>=y会让程序在点的x坐标小于y坐标时停止,这个停止点正好落在x=y的对角线附近(输出的x、y值接近res/√2≈707106.78),只覆盖了四分之一圆周的1/4部分。 - 路径选择偏离圆周:每次选择移动方向时,你只选离圆周
x²+y²=res²距离最小的步,但移动选项包含了x+1,y+1、x-1,y-1这类会偏离第一象限圆周的方向,在循环条件限制下,最终路径是贴合x=y对角线的折线,总步数近似于res*√2/2。 - 计算逻辑错误:最后用
circ*4/res计算时,相当于把这段折线长度乘以4,得到4*(res*√2/2)/res=2√2≈2.828,这就是你得到该结果的直接原因。
如果要正确逼近π,需要修改循环条件(比如让点从(res,0)移动到(0,res)),同时调整移动方向的选择逻辑,只保留能向圆周切线方向移动的选项(比如去掉x+1,y+1、x-1,y-1这类错误方向),确保路径始终贴合第一象限的圆周。
内容的提问来源于stack exchange,提问作者Tensor
相关产品推荐
相关产品推荐

