Math 蒙特卡罗模拟计算的精度π;

Math 蒙特卡罗模拟计算的精度π;,math,pi,Math,Pi,我创建了一个使用蒙特卡罗模拟计算π的模型,目前有3202959700000“点”和2515023487209在圆圈中。将其插入公式4*2515023487209/3202959700000返回3.1408743446993728956377440527897,这是非常不正确的。这是错误的,因为没有足够的“点”,还是我只是把它们放错了地方?使用蒙特卡罗模拟计算pi非常慢。例如,使用了100万分,获得了3.16分。你需要一个荒谬的点数来进一步完善这个估计 计算圆周率是学习蒙特卡罗模拟的一个很好的方法

我创建了一个使用蒙特卡罗模拟计算π的模型,目前有
3202959700000
“点”和
2515023487209
在圆圈中。将其插入公式
4*2515023487209/3202959700000
返回
3.1408743446993728956377440527897
,这是非常不正确的。这是错误的,因为没有足够的“点”,还是我只是把它们放错了地方?

使用蒙特卡罗模拟计算pi非常慢。例如,使用了100万分,获得了3.16分。你需要一个荒谬的点数来进一步完善这个估计


计算圆周率是学习蒙特卡罗模拟的一个很好的方法,但是如果你真的想尽快得到尽可能多的数字,我会告诉你。使用蒙特卡罗模拟计算圆周率非常慢。例如,使用了100万分,获得了3.16分。你需要一个荒谬的点数来进一步完善这个估计

计算π是学习蒙特卡罗模拟的一个很好的方法,但是如果你真的想尽快得到尽可能多的数字,我会告诉你。

代码

var size = 500;
var Xpos = Math.floor(Math.random() * size);
var Ypos = Math.floor(Math.random() * size);
var dist = Math.hypot(Xpos - size / 2, Ypos - size / 2);
生成范围为0..499的随机坐标。这不是间隔0..500的均匀采样,因此必须预计计算中会出现错误。第一个解决方法是将坐标加上0.5,以便将大正方形细分为由其中心表示的较小正方形。但最终,该方法的精度不可能比计算“大部分”位于圆内的500x500细分中的正方形更好。

代码

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


生成范围为0..499的随机坐标。这不是间隔0..500的均匀采样,因此必须预计计算中会出现错误。第一个解决方法是将坐标加上0.5,以便将大正方形细分为由其中心表示的较小正方形。但最终,该方法的精度不能比计算“大部分”位于500x500细分中的正方形更好在圆内。

我想你会发现随机数生成器的质量直接影响你的结果。你能报告一下你是如何生成随机点的,以及你如何确定它是否在圆内的吗?可能是您测试的图形不是一个完整的圆。@LutzL这是我用来创建点的代码,测量它们的距离,然后确定它们是否在圆中@EvilTeach我看到了,我使用JS创建随机数,因此通过提高随机函数的质量,我也减少了点的数量:(当我在70年代的80号垃圾桶上做的时候,我得到了3.1。我相信PRG的周期大约是256,点的分辨率很低。我认为一个字符单元格中有6个矩形。我想你会发现随机数生成器的质量对你的结果有直接影响。你能报告你是如何创建的吗随机点以及如何确定它是否在圆内?可能是因为你测试的图形不是一个完整的圆。@LutzL这是我用来创建点的代码,测量它们的距离,然后确定它们是否在圆内@EvilTeach我看到了,我使用JS创建随机数,所以通过提高随机函数的质量离子I还可以减少点的数量:(当我在70年代的80号垃圾桶上做的时候,我得到了3.1。我相信PRG的周期大约是256,点的分辨率很低。我认为一个字符单元中有6个矩形。啊,谢谢!我真的不需要尽可能多的数字。我只是担心出了问题。我认为链接的恶魔分层是一个很好的例子,说明了如何生成错误的随机数。尤其是行
rand()%(间隔+1)
不会产生均匀分布的值,因为
间隔
1000
。因此@Schotsl,如果您需要一些真实的反馈,请向我们展示您的真实代码。@SergGr我已经在这里上传了生成“点”的代码:现在您提到了使用+1的问题,我已经看到我的代码有一个问题。啊,谢谢!我真的不需要获取尽可能多的数字,我只是担心出了问题。我认为链接演示是一个很好的例子,说明了如何生成错误的随机数。特别是行
rand()%(间隔+1)
不会产生均匀分布的值,因为
间隔
1000
。因此@Schotsl,如果您需要一些真实的反馈,请向我们展示您的真实代码。@SergGr我已在此处上传了生成“点”的代码:现在您已经提到了使用+1的问题,我已经看到我的代码有一个问题。我理解问题是,虽然我想到的解决方案是从0…500而不是0…499创建数字,但如果我理解正确,你的意思是我必须像这样重写它,对吗?
var Xpos=Math.floor(Math.random()*size)+0.5;
对于两个轴是的。这就像将数值积分从左黎曼和更改为中点和。但是您仍然在近似像素化圆的面积,而不是圆形圆。最佳解决方案是提高场的“分辨率”以使其成为不太像素化的圆吗?是的。但为什么要这样做d?你需要它来在屏幕上显示一个像素,但是对于计算来说,根本没有舍入是最好的。我理解这个问题,虽然我想的解决方案是从0…500而不是0…499创建数字,但是如果我理解正确,你的意思是我必须像这样重写吗?
var Xpos=Math.floor(Math.random()*size)+0.5;
用于两个轴是的。这就像将数值积分从左黎曼和更改为中点和。但您仍然在近似面积