NetLogoプログラミング(その10:モンテカルロ法によるπの計算)

円周率πの計算法には様々なものがありますが、確率を使ってπを求める方法があります。

正方形の中にランダムに点を打ち、この点が正方形に内接する円の内側にある確率は
円の内部にある点の数÷打った点の総数 (※)
となります。ところで、正方形に内接する円の正方形に対する面積比は
π÷4
になりますから、ランダムな点を数多く打ち、(※)を求めればπが求められることになります。理論上は点の数を増やせば、より精度良くπを求めることができますが、実際にはこの方法では余り精度良くπを求めることはできません。

とはいうものの、NetLogoには乱数も初等数学関数もありますから、モンテカルロ法によるπの計算を視覚的に示して、πをどの程度精度良く求めることができるかを確認したいと思います。プログラムコードは単純で

to go
  let :x 0
  let :y 0
  let :count 0
  let :color black
  repeat 10 ^ :num [ ;; :num は、Slider で与える。
   set :x random 3200 / 100 - 16.00
   set :y random 3200 / 100 - 16.00
   ifelse sqrt (:x * :x + :y * :y ) <= 16 [
    set :count :count + 1 set :color red ]
    [ set :color white ]
  pset :x :y :color
  ]
  print 4 * :count / (10 ^ :num ) ;; 計算結果をCommand Center に出力
end

;; 点を打つ手続き
to pset [x y :c]
  setxy x y
  set color :c
  pd
  fd 0.001
  pu
end

です。点が円の内部にあるときは赤で外部にあるときは白にしましたので、実行結果は「日の丸」のような図になります。点の数は、ユーザーインターフェイスのSliderを使って、103〜107まで変えられるようにしました。次は、106個の点をランダムに発生させたときの実行終了画面です。このときは、πの計算値は 3.143076 となりました。

である。尚、このプログラムのソースファイルは ここ にあります。


哲猫