使用 Monte Carlo 模拟计算圆周率

Calculate pi using a Monte Carlo simulation

我创建了这个脚本

const size = 500;
const iterations = 10000000;

let inside = 0;
for (let i = 0; i < iterations; i++) {
  var Xpos = Math.floor(Math.random() * size);
  var Ypos = Math.floor(Math.random() * size);

  var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);

  if (dist <= size / 2) {
    inside++;
  }
}

document.write(4 * inside / iterations);

参见 https://jsfiddle.net/tr8tnxdm/3/ 将 100000000 个点放在 500、500 的网格中,记录圆圈内的点,最后除以总数并乘以 4。

这应该输出一个非常粗略的 pi 估计值,但它没有,我不明白为什么。我知道这不是因为低于或等于因为我也只在下面尝试过(第 11 行)

问题是这行代码:

var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);

一个参数应该在一个轴上不同,另一个参数应该在另一个轴上不同,像这样:

var dist = Math.hypot(Xpos - size / 2, Ypos - size / 2);

此更改大大提高了估计值(我得到 3.14...)

问题出在计算距离上。代码可以简化:

  var dist = Math.hypot(Xpos, Ypos);

  if (dist <= size) {
    inside++;
  }

在下面的代码片段中查看它是如何工作的。

const size = 500;
const iterations = 10000000;

let inside = 0;
for (let i = 0; i < iterations; i++) {
  var Xpos = Math.floor(Math.random() * (size));
  var Ypos = Math.floor(Math.random() * (size));

  var dist = Math.hypot(Xpos, Ypos);

  if (dist <= size) {
    inside++;
  }
}

document.getElementById("pi").innerHTML = 4 * inside / iterations;
<html>
  <body>
    <span id="pi"></span>
  </body>
</html>