首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用蒙特卡罗模拟计算π值

用蒙特卡罗模拟计算π值
EN

Stack Overflow用户
提问于 2018-05-04 11:27:14
回答 2查看 701关注 0票数 0

我创建了这个脚本

代码语言:javascript
复制
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行)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-04 11:39:16

问题在于这一行代码:

代码语言:javascript
复制
var dist = Math.hypot(Ypos-Xpos, size / 2 - size / 2);

一个参数在一个轴上应该是不同的,另一个在另一个轴上应该是不同的,如下所示:

代码语言:javascript
复制
var dist = Math.hypot(Xpos - size / 2, Ypos - size / 2);

这个变化大大提高了估计值(我得到3.14.)

票数 2
EN

Stack Overflow用户

发布于 2018-05-04 11:44:50

问题是计算距离。代码可以简化:

代码语言:javascript
复制
  var dist = Math.hypot(Xpos, Ypos);

  if (dist <= size) {
    inside++;
  }

看看它在下面的片段中是如何工作的。

代码语言:javascript
复制
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;
代码语言:javascript
复制
<html>
  <body>
    <span id="pi"></span>
  </body>
</html>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50173835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档