跳到主内容
UniKit

蒙特卡罗法估算圆周率

在单位正方形里投 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模拟实验

同类工具