Processing中Pi近似代码未通过Codegrade自动评分问题排查
问题排查与修正方案
你的代码核心逻辑完全偏离了蒙特卡洛近似Pi的原理,这是导致Codegrade不通过的根本原因,同时输出格式也不符合要求,具体问题和修正如下:
核心逻辑错误(最关键)
蒙特卡洛近似Pi的原理是:统计落在圆内的点数占总点数的比例,再乘以4(正方形面积为(2r)²=4r²,圆面积为πr²,推导得π=4*(圆内点数/总点数))。但你当前代码直接用已知的PI计算M,等于用Pi推导Pi,完全没有统计点数,这是致命错误。
其他问题
- 缺少用于统计的变量:没有累计圆内点数和总点数
- 输出格式错误:
println每次输出新行,不符合“同一行打印结果”的要求 - 无终止逻辑:
draw()会无限循环生成点,导致输出无限多结果
修正后的代码
float xM = 200.0; float yM = 200.0; int insideCount = 0; int totalCount = 0; void setup() { size(400, 400); background(255); circle(200, 200, 400); } void draw() { // 生成随机点 float x = random(0, 400); float y = random(0, 400); totalCount++; // 判断点是否在圆内 float distance = sqrt(pow(xM - x, 2) + pow(yM - y, 2)); if (distance <= 200) { insideCount++; stroke(0, 255, 0); } else { stroke(255, 0, 0); } point(x, y); // 计算Pi近似值 float piApproximation = (insideCount / (float)totalCount) * 4; // 同一行覆盖输出结果 System.out.print("\rPi近似值: " + piApproximation); // 设定终止条件,避免无限循环 if (totalCount >= 10000) { noLoop(); System.out.println("\n计算完成"); } }
修正说明
- 添加
insideCount和totalCount变量,分别统计圆内点数与总点数 - 移除错误的
M、N变量,改用点数比例计算Pi近似值 - 使用
System.out.print("\r" + ...)实现同一行输出,\r会将光标移到行首覆盖原有内容 - 添加终止条件,当总点数达到10000时停止循环
- 简化距离计算写法,逻辑保持一致
内容的提问来源于stack exchange,提问作者ff ff
相关产品推荐
相关产品推荐

