我创建了这个脚本
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行)
发布于 2018-05-04 11:39:16
问题在于这一行代码:
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);一个参数在一个轴上应该是不同的,另一个在另一个轴上应该是不同的,如下所示:
var dist = Math.hypot(Xpos - size / 2, Ypos - size / 2);这个变化大大提高了估计值(我得到3.14.)
发布于 2018-05-04 11:44:50
问题是计算距离。代码可以简化:
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>
https://stackoverflow.com/questions/50173835
复制相似问题