百度一下,計算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