京大生しょーの雑多なブログ

とある京大生が思うままに書いているブログです

【モンテカルロ法】Pythonとjavascriptで円周率の値を計算してみた

こんにちは、しょーです。

今回は、ふとモンテカルロ法ってPythonで実装できるんじゃね?」と思ったので、自分なりに試して遊んでみました。また、Pythonの他にjavascriptでも遊んでみました。

※コードを書くのはそんなにうまくないのでもし下手だと思ってもご容赦くださいm(__)m

モンテカルロ法とは

そもそもモンテカルロ法とは、ある求めたい現象・事象に対して、入力に膨大な量の乱数を用いることで確率的に解決しようとする手法のことです。より大雑把にいうと「大量にシミュレーションして、それによって得られた確率によって現象を求める」ということです。

そして、このモンテカルロ法を応用することで、円周率πの値を概算することができます。

具体的な考え方

手順1

まず、以下のようなxy座標平面上に存在する、一辺の長さが2の正方形と、それに内接するような半径1の円を考えます。

xy平面上の正方形と円

手順2

次に、上の正方形の内部に乱数的に座標を取ります。この時、以下のように「その座標が円の内部であればOK」「円の外部であればNG」であると考えます。

OKな座標とNGな座標の例

すると、十分な試行回数を重ねたとき、「OKな座標である」確率は、(円の面積)÷(正方形の面積)であると考えることができるので、

{\frac{(OKな座標である回数)}{(試行回数)}} = {\frac{π(=円の面積)}{4(=正方形の面積)}}

という式を立てることができます。したがって、円周率πについて、

π = {\frac{(OKな座標である回数)}{(試行回数)}} × 4

を求めればよいことが分かりました。

Pythonによる実装

では、実際にPythonによる実装を行っていきたいと思います。

まず、乱数的に座標を決めなければならないので、randomモジュールを利用して、-1から1までの範囲で乱数を生成します。この要領で乱数を二つ生成することで、「正方形の内部にある座標」を表現することができます

続いて、「ランダムに生成した座標が円の内部にあるかを判定する関数」を定義します。この方法にはいろいろな方法があるかと思いますが、今、円の中心が座標平面の原点にあることを考えると、円の半径が1であることを加味して、「その座標から原点までの距離が1以下であるか」を判定すれば十分であることがわかります(1以下であればOK、1より大きければNG)。

以上から、ある試行回数分だけ作業を行った時の円周率の値を計算することができます。今回は比較のために、試行回数を10回、100回、1000回、10000回、100000回、1000000回、10000000回の7パターンで検証してみます。

それでは、以下のコードで実際に試してみます。

実装したPythonのコード

念のため、2回実行してみると、それぞれ以下のような結果になりました。

実行結果(1回目)

実行結果(2回目)

二つを見比べてわかるように、試行回数が少ないときは実際の円周率の値(=3.141592...)とは遠い値になり、試行回数を増やしていくにつれて実際の値に近づいていくことがわかります。

また、試行回数が多くなるにつれて各実行ごとの結果に対してブレが小さくなっていることがわかります。

javascriptによる実装

javascriptによる実装も、考え方はPythonの時と同じ考え方を用いました。

そして、以下のようなコードを書いて実行しました(結果をブラウザ上で見たかったので、HTMLに埋め込む形で書きました)。

javascriptのコード

同じく2回実行したところ、結果は以下のようになりました。

実行結果(1回目)

実行結果(2回目)

当たり前ですが、javascriptでも、Pythonと同じようなことがいえるのがわかります。

なお、試行回数が大きくなるほど真の値(3.141592...)に近づいていくのは、統計学における「大数の法則」に則っているからだと考えられます。

 

 

以上で、今回の記事を終わりにしたいと思います。

それではまた!