Я создал этот скрипт
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.
Это должно дать очень приблизительную оценку числа Пи, но это не так, и я не могу понять, почему. Я знаю, что это не из-за того, что ниже или равно, поскольку я также пробовал его только с нижним (строка 11)
@phuzi указано общее количество точек и их количество в круге.
Да, но какие реальные ценности он дает?
Его возвращение 3.0042532
Вы пробовали его отладить, проверьте значения, которые дает на каждом этапе расчета. При этом Math.hypot(Ypos-Xpos, size / 2 - size / 2); выглядит неправильно



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в этой строке кода:
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>
«Это должно дать очень приблизительную оценку числа пи», какие значения он дает?