如何实现圆与正方形场景下的monteCarloPi函数及单点绘制问题解决
蒙特卡洛法估算圆周率代码问题排查及修复
你的代码存在以下核心问题,是导致只绘制一个点、模拟无法正常运行的原因:
- 随机坐标生成位置错误:当前
x、y的随机生成逻辑写在模拟循环外部,所有循环都会复用同一个固定坐标,自然只会绘制一个点。需要把随机坐标生成逻辑放到循环内部,每次模拟生成新的落点。 - 圆内判断条件错误:当前判断条件写的是
origin <=1,只适用于半径为1的特殊场景,通用场景下应该判断落点到原点的距离平方是否小于等于半径平方,即origin <= radius**2。 - 圆周率计算逻辑错误:蒙特卡洛法的公式是
4 * (圆内点数 / 总模拟次数),你当前用圆内点数除以圆外点数points_in_square,逻辑完全错误,总模拟次数就是传入的参数n,不需要单独统计圆外点数。 - 返回语句位置错误:当前
return pi写在模拟循环内部,第一次循环执行完就会直接返回结果,后续的n-1次模拟根本不会执行,这也是只出现一个点的核心原因之一,需要把return语句放到循环外部,所有模拟执行完成后再返回结果。 - 额外转义字符问题:代码里的
<是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
相关产品推荐
相关产品推荐

