モンテカルロ法で円周率計算

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)