蒙特卡罗法估算圆周率
在单位正方形里投 N 个随机点,落在四分之一圆内的比例乘 4 就是 π 的估算值;随机源可注入,默认用自研 LCG 与种子,相同种子结果完全可复现,并给出绝对/相对误差与 1/√N 误差量级。
浏览器本地运行所有计算都在你的浏览器里完成,数据不会离开本机。
投点次数 N
估算结果
误差量级约 1/√N。
输入投点次数后即可估算
投点数: 0 · 命中点数: 0 · 估算 π: 0
这个工具能做什么
- 教学演示随机模拟:从 1000 到 100 万次投点,直观看到精度随 √N 缓慢提高。
- 验证可复现性:同一个种子重复运行得到完全相同的估算值与采样点序列。
- 做基准测试:把 N 拉到 100 万,比较不同语言/实现的循环性能。
示例
输入
10000
输出
10000 次投点中命中 7798 次,π ≈ 4 × 7798 ÷ 10000 = 3.1192 真实值 Math.PI = 3.141593,绝对误差 0.022393(相对 0.712791%) 命中率:77.98%(理论上 π/4 ≈ 78.539816%) 标准误差量级 1/√N ≈ 0.01,想多一位小数需要 100 倍点数 随机源:内置 LCG(seed = 42,相同种子结果可复现) 前 10 个点:(0.252345, 0.088125)✓ (0.577281, 0.222554)✓ (0.37566, 0.025664)✓ (0.447281, 0.11846)✓ (0.873814, 0.994634)× (0.853203, 0.499677)✓ (0.642001, 0.861456)× (0.59647, 0.09075)✓ (0.14021, 0.950088)✓ (0.924555, 0.889469)×
种子 42、10000 次投点得到 π ≈ 3.1192,与真实值差 0.022;这是 1/√N 误差量级下的正常结果。
常见问题
为什么结果和 3.14159 差这么多?
蒙特卡罗法的标准误差量级是 1/√N:1 万次投点约 ±0.01,10 万次约 ±0.003,100 万次约 ±0.001。想多精确一位小数,投点数要乘 100,所以它算 π 的效率远低于级数法——这正是它的教学价值所在。
同一个种子结果一样吗?
完全一样。默认使用自研 LCG(a = 1664525、c = 1013904223、m = 2³²),状态由种子决定,因此投点序列、命中数与估算值都可复现;把种子从 42 改成 7 就会得到另一组结果。
随机源可以换成别的吗?
可以。函数接受 `random?: () => number` 注入,浏览器页面里可传 Math.random,测试里可传任意确定性序列。页面默认用种子 LCG,保证每次刷新结果一致、便于核对。
最多能投多少次?
100 万次。再多会明显卡顿,因为所有点都在浏览器主线程里算;需要更大规模请用本地脚本或 Web Worker。
为什么命中率是 π/4?
四分之一圆面积是 π/4,单位正方形面积是 1,均匀投点落在圆内的概率就等于面积比 π/4,所以 4 × 命中率 ≈ π。
关键词:蒙特卡罗Monte Carlo估算圆周率pi estimation随机投点种子随机数LCG模拟实验