モンテカルロ法で円周率計算
30分プログラム、その719。モンテカルロ法で円周率計算をやってみました。
モンテカルロ法はhttp://www.geocities.jp/turtle_wide/softcomp/al/p03.htmを参考にしました。π = (半径1の扇形の中に入った点の数) / (打った点の数の総数) * 4で出しています。
ところで、コード中の「半径1の扇形の中に入った点の数」を求めるコードはこうなっています。この流れるような感じが実に美しい。
val count = takeN(n,r) zip takeN(n,r) map(distance_2(_)) filter(_ < 1.0) length
使い方
$ scala pi.scala 3.119999885559082 $ scala pi.scala 3.240000009536743
多少ずれてるけど、まあこんなもんでしょう。
ソースコード
import java.util.Random def takeN(n : Int, r : Random) : List[Float] = { if(n == 0) List() else r.nextFloat() :: takeN(n-1,r) } def distance_2( p : (Float,Float)) = p._1 * p._1 + p._2 * p._2 val r = new Random val n = 100 val count = takeN(n,r) zip takeN(n,r) map(distance_2(_)) filter(_ < 1.0) length val pi = count.toFloat / n * 4.0 println(pi)