星空を横切る機関車を眺めていると円周率が計算されているWebサービスを作ってみた

今月の"作ってみたコーナー"は…

あ…ありのまま、今起こった事を話すぜ!
「おれは星空を横切る機関車を眺めていたと思ったらいつのまにか円周率が計算されていた」
な…何を言ってるのかわからねーと思うが、おれも何をされたのかわからなかった(AA略)

…そんなWebサービスです。(笑)

ビュフォン鉄道314

ネーミングの由来は推して知るべし!

これは何?

パッと見は、星空の中を機関車が延々と横切っていくだけのFlashですが、実は裏でビュフォンの針の理論に基づいて円周率を計算するWebサービスになっています。

ビュフォンの針って何?

まずは、例によってWikipediaから定義を引用…。

ビュフォンの針(Buffon's needle problem)は18世紀の博物学者ジョルジュ=ルイ・ルクレール、コント・ド・ビュフォンが提起した数学上の問題である。

もし床に平行な線をひいて、そこに針を落すならば、2本の線と針が交差する確率はどのようになるか

積分幾何学を使ってこの問題は解け、またこの方法を使って、モンテカルロ法で円周率の近似値を求めることができる。

という事で、針を投げて平行線と交わったものの数を数えると、なぜだか円周率が計算できてしまうという、何とも不思議なお話です。*1 詳細な理論の説明についてはWikipedia先生に譲ります。

星空とビュフォンの針がどう結び付くの?

ビュフォンの針の話は、その名の通り、針を落として数を数えるというものなんですが、針が紙に落ちる様子をFlash化してもあまり面白味が無いので、今回は、落とす針を夜空の星に見立てたものにしてみました。

内部的には、仮想の平行線が引いてあるフィールドに仮想の針を落として、平行線と交わったかどうかを計算しています。画面上では、針1本が星1個に該当し、針の角度に応じて星の大きさを変えて、平行線と交わったと判定された星は黄色く表示しています。左端で星を生成して画面をスクロールさせて、星空っぽくしています。

ある程度の数(今回は200個)だけ星が生成されたら、平行線と交わったと判定された星の数をサーバに送って、サーバ側でビュフォンの針の式に当てはめて円周率を計算して、Flash側に返すようにしています。

サーバから計算結果を受け取ったら、それを機関車に載せて、右から左へ受け流し続けます。

ある意味分散コンピューティングだよね

クライアント(Flash)からサーバに送られた値は、サーバ側で蓄積されて円周率を計算するようになっているので、針を落として数える部分の処理をクライアントに任せている、ある種の分散コンピューティングとも言えるかもしれません。

ちなみにサーバ側での計算は、桁数を確保する為にBigDecimalで計算するようにしています。なので、理論上は(サーバの性能が許す限り)無限に桁数を計算できる…んですが、クライアント側の方は通常の数値型変数で計算するので、結局、あまり良い精度が得られる訳ではないかもしれません…。

雑感

普段、サーバ側のプログラムしか書かないので、Flash作るのになかなか苦労しました。どうにもイベントドリブンなプログラミングって苦手です…。

…なんて思っていたら、今月出たWEB+DB PRESSに、「JavaScript/Flash/HTML5スパゲッティコードにならないためのモダン設計入門」なんて特集があるではないですか!?

WEB+DB PRESS Vol.53

WEB+DB PRESS Vol.53

先に読んでいたらもう少しコードがきれいに書けたかなぁ…なんて後の祭り状態になりつつ、真の(?)MVCやステートパターンについてちゃんと勉強しようと心に誓ったのでした…。

*1:現実世界でビュフォンの針をやろうとするとどうなるかは、こちらなんぞをどうぞ。→デイリーポータルZ:針を落とせば円周率