使用 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>
我创建了这个脚本
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>