僕は発展途上技術者

大人のためのスクラッチ(1) - ダーツを10万本投げて円周率を求める

大人でも楽しめる題材でスクラッチを楽しんでみようということで、「大人のためのスクラッチ」というシリーズでスクラッチのプロジェクトを作ってみる。

第1回目は、ダーツをランダムに投げまくって円周率を求めてみよう、ということをやってみる。

元ネタは、「プログラミング練習問題集」というページのこちら↓

» モンテカルロ法で円周率を求める

モンテカルロ法というのは、本来は数学の理論などを駆使して計算で求めるべきことを、ランダムな結果がでるテストを膨大な回数繰り返して力技で求めてしまう手法のことを言う。

半径1の円とそれにピッタリくっつく1辺の長さ2の正方形があったとする。

いまからやたらめったらどこも狙わずにこの正方形の内側に10万回ダーツを投げたとして、そのうち円の内側に何本ダーツが入ったかを数えれば、円の面積と正方形の面積の比率がわかる。

正方形の面積は 2 x 2 = 4 なので、

円の面積 / 4(正方形の面積) = 円の内側に当たったダーツの本数 / 100000(ダーツを投げた回数)

と考えていいだろう。

たとえば、もしダーツがちょうど半分当たったら、円の面積も正方形の半分と考えていいだろうということだ。

両辺に4をかけて、

円の面積 = 円の内側に当たったダーツの本数 x 4 / 100000

となる。

さて、円の面積の公式を覚えているだろうか?小学生のときの記憶を思い起こしてみよう。

円の面積 = 円周率(π) x 半径 x 半径

が円の面積を求める公式だ。

なぜ、円の面積が上記の公式で求められるのかを直感的に説明したアニメーションをスクラッチで作ってみたので、公式だけ示されても納得いかない、モヤモヤするという方は見て欲しい。

もう一度、ダーツを投げる円と正方形の図をみてみよう。

この円の半径は1なので、

円の面積 = 円周率(π) x 1 x 1

円の面積 = 円周率(π)

つまり円の面積はそのまま円周率と同じなのだ。

赤字で書いた式を書き直すと、

円周率 = 円の内側に当たったダーツの本数 x 4 / 100000

で求めることができる。

実際に正方形と円が描かれた厚紙を用意して10万本ダーツを投げてみるのは面倒くさいので、それをスクラッチでシミュレーションしてみる。

まず、ペンを使って赤い円を描く。

実はスクラッチ上では長さを100倍引き伸ばした世界でシミュレーションする。

なので、半径が100の円を描くのだが、これは、太さ200のペンを一回ポチッと下ろすだけで描くことができる。

そして、ダーツを10万回投げるプログラムがこちらだ。

total という変数に 100000 をセットしている。

これがダーツを何回投げるか、つまり繰り返す数だ。

繰り返しの中身はこうだ。

前述したように、スクラッチ上では長さを100倍引き伸ばした世界でシミュレーションしているので、0, 0 を中心とした1辺200の正方形の中にランダムにダーツを投げることになる。

黒い点のスプライトを x 座標が -100 から 100 の間のどこかに、y 座標も -100 から 100 の間のどこかに定めて移動する。

これがつまりダーツをその場所に投げたということだ。

そして、赤色、つまり縁に触れたら inside という変数を1増やす。

つまり、inside の値は円の内側に当たったダーツの本数だ。

これを10万回繰り返し、最後に、円周率 pi の値を求めている。

赤字で書いた式と同じだ。

それでは実際にスクラッチのプログラムを実行してみてほしい。

10万回の繰り返しは時間がかかるが、シフトキーを押しながら緑の旗ボタンを押せば、ターボモードになって処理速度が速くなるので、少し待てば結果が出る。

ここまでで実際にやっているのは、正方形と円の中にダーツをただひたすら投げ、円の中に当たったダーツを数えているだけだ。

そんな力技で円周率を自分で求めることができるというのが面白い。

プロフィール

株式会社まちクエスト代表、つくる社LLC代表。

Raspberry Piではじめる どきどきプログラミングを書きました。

Amazonから図書館検索 Libron、iPhoneアプリ ひらがなゲーム かなぶん を作っています。

Twitter @jishiha

最近のエントリー

アーカイブ