円周率を求める-モンテカルロ法
説明
円周率を求めます。円周率を求める方法は非常にたくさんありますが、その中で見ていて面白いのがモンテカルロ法です。
イメージとしては紙に描いた正円の上に適当に砂粒を投げ、その砂粒が円の中に入っているか、円の外なのかを数えていきます。これを何度も繰り返します。すると紙の上には一様に(均等に)砂がばらまかれます。円の中に入った砂粒の数と投げた回数から円周率を求めることができます。つまり円の内側の砂の数を回数で割れば円周率を求めることができます。
なお、この方法は最終結果が常に一定にはなりません。乱数を利用するため仕方ありませんが、それでも回数を多くすることで一定の範囲の値に収まるようになっています。
Studioで試す
以下のリンクから Jasmine Tea でこのサンプルプログラムを Studio 画面で開いて実際に試すことができます。プログラムを実行したいときは、エディターの右下にある青色の「実行」ボタンを押してください。
プログラム
// 円周率を求める(モンテカルロ法)
cls
n=10000
count=0
for i=1 to n
x=random(-1000,1000)/1000
y=random(-1000,1000)/1000
c=19
if (x*x+y*y)<1 then
count=count+1
c=7
end if
pset((x+1)*100,(y+1)*100),c
next
print 4*count/n
解説
2行目で画面を消去しています。
3行目で繰り返す回数を変数nに入れています。
4行目が円の中に投げられた砂粒の数を数えるための変数です。
5行目から14行目までが繰り返し砂を投げる処理になります。プログラムで砂を投げるには乱数を利用します。
6行目で横方向の乱数値を、7行目で縦方向の乱数値を求めます。Jasminでは乱数値は整数値なので-1000〜1000までの乱数値を発生させた後に1000で除算しています。精度を高めたい場合は、この数値部分も多少変更したほうがよいかもしれません。1000で除算することで乱数値は-1.0〜1.0までの小数値になります。
8行目はグラフィック画面で円からはみ出した部分の点の色を変数cに入れています。
9行目が投げた砂が円の中に入っているかを調べている部分です。「x
10行目では円の中に砂が落ちたことになるので変数countに1を足します。
11行目でグラフィック画面に描く円の色を変数cに入れています。
13行目でグラフィック画面に点を描いています。見やすくするために100倍しています。200にすると画面からはみ出す場合があり、そうなるとエラーになってしまいます。190倍くらいにすると多少見やすくなります。
15行目で円周率を表示しています。ここでの計算は円の面積と正方形の面積比からです。