我已经创建了这个脚本
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行)
答案 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>