使用蒙特卡罗模拟计算pi

时间:2018-05-04 11:27:14

标签: javascript montecarlo pi

我已经创建了这个脚本

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/在500,500网格中放置100000000个点,圆圈内的圆点被注明,最后,它除以总数并乘以4。

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

2 个答案:

答案 0 :(得分:2)

问题在于这行代码:

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

一个参数应该是一个轴上的差异,另一个参数应该是另一个轴上的差异,如下所示:

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

这一改变极大地改善了估计(我得到了3.14 ......)

答案 1 :(得分:1)

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

  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>