Вычислить пи с использованием моделирования Монте-Карло - PullRequest
0 голосов
/ 04 мая 2018

Я создал этот скрипт

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)

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Проблема в расчете расстояния. Код можно упростить:

  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>
0 голосов
/ 04 мая 2018

Проблема в этой строке кода:

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

Один аргумент должен быть разностью на одной оси, а другой - разницей на другой оси, например:

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

Это изменение значительно улучшает оценку (я получаю 3,14 ...)

...