You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用非随机圆周行走法生成的是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:02:33