我的世界中精确计算圆周率的各种方法

时间:2017-05-15 来源:88130安卓下载 作者:佚名

  今天游戏园的小编就为大家解析一下我的世界中精确计算圆周率的各种方法都有什么,希望此篇文章能帮到大家!

  一,通过概率求π

  这里是之前那个帖子的机器还有我用随机原理做的类似机器的分析,鉴于可能会引起争端,我就把作者的名字放到折叠里面了。。。强调一点,用随机求π是无效率可言的,所以推荐阅读下一种方法。

  注意:字多图少。

  其实,确定一点,他本身的算法是正确的,从数学的角度上来说,得到的结果的确是会趋近于π,但是,有一点,这一点我想肯定是所有的高中数学老师都不断强调的东西,那么是什么呢?答案是,定义域。

  不断生成3个1-18内的随机数a,b,c

  这是帖子里的原话,我们可以看到,他的想法是取a,b,c∈[1,18],这三个变量的定义域是[1,18],就是说,abc这三个数可以取1到18包括首尾的任何数,然而,由于在minecraft里,

  他采用的随机数生成器是发射器+命令方块的组合,这样就决定了,这个随机器只能取到区间[1,18]里的所有整数,那么定义域就发生了小小的变化,现在的情况是a,b,c∈[1,18]∩Z,Z为整数集。

  这样的话,整个的算法的输出结果就会发生极大的改变,现在abc都有18种可能,而总共的可能性也减为了18^3=5832种可能,这样的话我们可以在其它平台上很轻易的计算这些可能性有多少可以构成钝角三角形,我通过Excel计算出的结果是有1474种,当然这几天Excel被我大数计算玩崩了,我只验算了两遍。。。,没法验算第三遍。。。

  有兴趣的同学可以也来算一算。

  那么我们计算这个数干什么呢,很显然,如果我们随机多次,必定有一个会无限趋近的结果,而随机总次数和成功次数的比必定趋近于总可能数和成功可能数的比,那么我们假设完美情况,即总次数为5832次,而成功次数为1474次,那么通过他的公式,我们可以变换出

  π=4(n/m)+2,其中n为成功次数,m为总次数,

  带进去可想而知,结果为3.01097...这个误差很显然不能接受。

  而在mc中的挂机结果也证明了计算结果

  结果约为3.03320,相比于圆周率,更接近于我所计算的结果。2s一取样,想想近六千次我挂了多长时间。。。

  同样的,我也自己建了一个用随机器求π的机器,下面上图,

  机器概貌

  非常直观的设计,随机器会随机到这64*64这个大正方形里的随机一个点,而落入圆的会被计数。

  算法很简单,S(圆)=πr^2 S(方)=4r^2

  而4*S(圆)/S(方)=π

  顺带一提,这个圆是我手撸的,如果使用严格计算过并分配过面积的圆结果会更精确

  由于一个随机器带不动,所以我就建了16个随机器等概率随机到这正方形里的等面积16份,一来提升取样速度,二来在数学上其实是等效于一个16倍速的随机器。

  这个的效率是每秒取大约200次的样,由于太快我就不仔细数了。

  这是我去吃个饭挂机的成果(其实,连续挂了十几次,成绩都很稳定)

  今天游戏园的小编就为大家解析一下我的世界中精确计算圆周率的各种方法都有什么,希望此篇文章能帮到大家!

  一,通过概率求π

  这里是之前那个帖子的机器还有我用随机原理做的类似机器的分析,鉴于可能会引起争端,我就把作者的名字放到折叠里面了。。。强调一点,用随机求π是无效率可言的,所以推荐阅读下一种方法。

  注意:字多图少。

  其实,确定一点,他本身的算法是正确的,从数学的角度上来说,得到的结果的确是会趋近于π,但是,有一点,这一点我想肯定是所有的高中数学老师都不断强调的东西,那么是什么呢?答案是,定义域。

  不断生成3个1-18内的随机数a,b,c

  这是帖子里的原话,我们可以看到,他的想法是取a,b,c∈[1,18],这三个变量的定义域是[1,18],就是说,abc这三个数可以取1到18包括首尾的任何数,然而,由于在minecraft里,

  他采用的随机数生成器是发射器+命令方块的组合,这样就决定了,这个随机器只能取到区间[1,18]里的所有整数,那么定义域就发生了小小的变化,现在的情况是a,b,c∈[1,18]∩Z,Z为整数集。

  这样的话,整个的算法的输出结果就会发生极大的改变,现在abc都有18种可能,而总共的可能性也减为了18^3=5832种可能,这样的话我们可以在其它平台上很轻易的计算这些可能性有多少可以构成钝角三角形,我通过Excel计算出的结果是有1474种,当然这几天Excel被我大数计算玩崩了,我只验算了两遍。。。,没法验算第三遍。。。

  有兴趣的同学可以也来算一算。

  那么我们计算这个数干什么呢,很显然,如果我们随机多次,必定有一个会无限趋近的结果,而随机总次数和成功次数的比必定趋近于总可能数和成功可能数的比,那么我们假设完美情况,即总次数为5832次,而成功次数为1474次,那么通过他的公式,我们可以变换出

  π=4(n/m)+2,其中n为成功次数,m为总次数,

  带进去可想而知,结果为3.01097...这个误差很显然不能接受。

  而在mc中的挂机结果也证明了计算结果

  结果约为3.03320,相比于圆周率,更接近于我所计算的结果。2s一取样,想想近六千次我挂了多长时间。。。

  同样的,我也自己建了一个用随机器求π的机器,下面上图,

  机器概貌

  非常直观的设计,随机器会随机到这64*64这个大正方形里的随机一个点,而落入圆的会被计数。

  算法很简单,S(圆)=πr^2 S(方)=4r^2

  而4*S(圆)/S(方)=π

  顺带一提,这个圆是我手撸的,如果使用严格计算过并分配过面积的圆结果会更精确

  由于一个随机器带不动,所以我就建了16个随机器等概率随机到这正方形里的等面积16份,一来提升取样速度,二来在数学上其实是等效于一个16倍速的随机器。

  这个的效率是每秒取大约200次的样,由于太快我就不仔细数了。

  这是我去吃个饭挂机的成果(其实,连续挂了十几次,成绩都很稳定)

  其中TRP代表总次数,Ethylene_china代表在圆内的次数

  这样我们可以在mc中计算出大约的结果为

  但是这个算法也是有极限精确度的,实际上这个机器由于定义域同样不能连续取样,理论上的最大精确度通过计算确定只有三位,虽然三位的精度大概提了一点,但是依旧是没有效率的

  下图为我处理数据并输出的机器

  过段时间我会整理出在minecraft中利用计分板系统进行浮点运算的方法,届时我会发帖详细介绍。下文也略有提及。

  至于有人已经做了计分板简单计算器并声明了版权。。。不过那个帖子里好像没怎么说。。。总之我不会开发计分板计算器啦,虽然这个机器改改就可以作为一个除法模块。

  另外附上输出视觉上的浮点数的代码

  tellraw @p {text:"π≈",extra:[{score:{name:"Ethylene_china",objective:"in2"}},{text:"."},{score:{name:"Ethylene_china",objective:"in5"}}]}

  复制代码

  其实,这个代码是不完全的,应该补足上小数位为0的检查计分板。但是由于我们计算的目标为π而不是所有可能的小数,所以随便啦,不需要考虑那么多情况。

  毫无疑问,求π的话最好还是利用公式法去计算,毕竟增加了计分板四则,不用真是太可惜了。

  公式的话其实百度百科或者wiki里面比比皆是,而关于我们需要什么公式呢,很简单,我们先要简单的!

  因为实际上计分板的加减乘都还算是比较好用的,至于除嘛,计分板的是整数除法并且不带四舍五入,这个设定既不方便又很方便,除法嘛,就按惯例来用一个计分板储存整数位,一个计分板储存小数位,基本上作为简单计算器是够用了,其他例如开方之类的计算,我们也会有很多简化并高度适用计算机的算法,最有名的例如雷神之锤三里的快速开方取倒数的方法,关于求π的我们也有高斯-勒让德算法,25次迭代可以计算到π后4500万位的数字。

  话题有点岔开了,其实我们只需要测试最简单的计算算法就好啦,那么我们需要什么样的公式呢?

  我在百度百科里找到一个看上去不错的公式,Leibniz定理,,这个公式的优点是计算过程非常简单,但是缺点也很明显,我们可以看出这个式子的收敛速度比较慢,如果我们要精确到小数后一位的话,我们起码得等到处理第6项即1/11≈0.091,即所处理的小数有效数字已经退至十分位之后,这时除了进位没有什么能影响到前面的数字,同理如果要精确到百分位得等到1/111之后,千分位则要1/1111,综上,每精确一位小数我们所需等待的时间成指数级增长。。。至少我挂机没计算出万分位。。。

  下面上图,这是这个公式的cb化处理,由于尝试压缩时间,右上去掉了一个中继器,可能导致不稳定,一旦加上,将会100%稳定,与Excel内部的计算结果完全相同。存档过会发布。

  附上计算结果,

  当然,虽然我还未完成,但是我还是比较想制作出一个mc里的快速算法,但仔细想了想。。。要直接做出可以足够支撑快速算法的位数的系统我还是有点压力

  但是现在正在做一个可以计算56位的圆周率的机器,主要原理是使用了泰勒展开。

  姑且上个图,留待日后更新。

  我的世界蜡笔小新皮肤下载

  我的世界不知火舞皮肤下载

  我的世界新爆炸物全测评 大杀器的盛宴

热门搜索

手游排行榜

  • 最新排行
  • 最热排行
  • 评分最高