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

如何实现圆与正方形场景下的monteCarloPi函数及单点绘制问题解决

蒙特卡洛法估算圆周率代码问题排查及修复

你的代码存在以下核心问题,是导致只绘制一个点、模拟无法正常运行的原因:

  • 随机坐标生成位置错误:当前x、y的随机生成逻辑写在模拟循环外部,所有循环都会复用同一个固定坐标,自然只会绘制一个点。需要把随机坐标生成逻辑放到循环内部,每次模拟生成新的落点。
  • 圆内判断条件错误:当前判断条件写的是origin <=1,只适用于半径为1的特殊场景,通用场景下应该判断落点到原点的距离平方是否小于等于半径平方,即origin <= radius**2。
  • 圆周率计算逻辑错误:蒙特卡洛法的公式是4 * (圆内点数 / 总模拟次数),你当前用圆内点数除以圆外点数points_in_square,逻辑完全错误,总模拟次数就是传入的参数n,不需要单独统计圆外点数。
  • 返回语句位置错误:当前return pi写在模拟循环内部,第一次循环执行完就会直接返回结果,后续的n-1次模拟根本不会执行,这也是只出现一个点的核心原因之一,需要把return语句放到循环外部,所有模拟执行完成后再返回结果。
  • 额外转义字符问题:代码里的&lt;是HTML转义的小于号,Python代码中直接写<即可。

修正后的完整代码

import turtle as t
import random

def monteCarloPi(n, radius):
    '''
    接收模拟次数n和圆半径,返回估算的圆周率浮点值
    '''
    # 设为最快绘制速度,避免模拟次数多时卡顿
    t.speed(0)
    # 绘制原点标记
    t.dot(5, 'black')
    # 绘制内切圆
    t.pu()
    t.goto(0, -radius)
    t.pd()
    t.circle(radius)
    # 绘制外接正方形
    t.pu()
    t.goto(-radius ,-radius)
    t.pd()
    for _ in range(4):
        t.fd(radius * 2) 
        t.lt(90)
    t.pu()
    
    points_in_circle = 0
    for _ in range(n):
        # 每次循环生成新的随机坐标
        x = random.uniform(-radius, radius)
        y = random.uniform(-radius, radius)
        t.goto(x, y)
        # 圆内点画红色,圆外点画蓝色,方便区分
        if x**2 + y**2 <= radius**2:
            points_in_circle += 1
            t.dot(2, 'red')
        else:
            t.dot(2, 'blue')
    # 所有模拟完成后计算pi
    pi = 4 * (points_in_circle / n)
    # 绘制完成后保持窗口不自动关闭
    t.done()
    return pi

# 测试调用示例:模拟1000次,半径200
# print(monteCarloPi(1000, 200))

内容的提问来源于stack exchange,提问作者Mike Son

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:54:03