百度一下,计算PI的方法还真很多。但在hadoop examples代码中的注释写的是:是采用 Quasi-Monte Carlo 算法来估算PI的值。
维基百科中对Quasi-Monte Carlo的描述比较理论,好多难懂的公式。
好在google了一把,找到了斯坦福大学网站上的一篇文章:《经过扔飞镖也能得出PI的值?》,文章很短,图文并茂,并且很好理解。
我这里将那篇文章的重要部分截了个图:
对上面的图再稍微解释一下:
一、Figure2是Figure1的右上角的部分。
二、向Figure2中投掷飞镖若干次(一个很大的数目),而且每次都仍在不一样的点上。
三、若是投掷的次数很是多,Figure2将被刺得“千疮百孔”。
四、这时,“投掷在圆里的次数”除以“总投掷次数”,再乘以4,就是PI的值!(具体的推导过程参见原文)
在这个算法中,很重要的一点是:如何作到“随机地向Figure2投掷”,就是说如何作到Figure2上的每一个点被投中的几率相等。
hadoop examples代码中,使用了Halton sequence保证这一点,关于Halton sequence,你们能够参考维基百科。
我这里再总结一下Halton sequence的做用: 在1乘1的正方形中,产生不重复,而且均匀的点。每一个点的横坐标和纵坐标的值都在0和1之间。
正是这样,保证了可以作到“随机地向Figure2投掷”。java
有人总结了一下,这个实际上叫作蒙特卡洛算法,咱们取一个单位的正方形(1×1) 里面作一个内切圆(单位圆),则 单位正方形面积 : 内切单位圆面积 = 单位正方形内的飞镖数 : 内切单位圆内的飞镖数 ,经过计算飞镖个数就能够把单位圆面积算出来, 经过面积,在把圆周率计算出来。
注意 ,精度和你投掷的飞镖次数成正比。算法
[java] view plaincopyprint?oop
<span style="white-space:pre"> </span>hadoop jar $HADOOP_HOME/hadoop-*-examples.jar pi 100 100000000 网站
后面2个数字参数的含义:
第1个100指的是要运行100次map任务
第2个数字指的是每一个map任务,要投掷多少次
2个参数的乘积就是总的投掷次数。
我运行的结果: google
hadoop的examples中的计算PI的方法属因而采用大量采样的统计学方法,仍是属于数据密集型的工做。 spa
转载请注明出处: http://www.ming-yue.cn/hadoop-pi/.net