Вычислить пи с помощью моделирования Монте-Карло

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

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 04.05.2018 13:29

@phuzi указано общее количество точек и их количество в круге.

Schotsl 04.05.2018 13:30

Да, но какие реальные ценности он дает?

phuzi 04.05.2018 13:31

Его возвращение 3.0042532

Schotsl 04.05.2018 13:37

Вы пробовали его отладить, проверьте значения, которые дает на каждом этапе расчета. При этом Math.hypot(Ypos-Xpos, size / 2 - size / 2); выглядит неправильно

phuzi 04.05.2018 13:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
541
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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>

Другие вопросы по теме