星空を横切る機関車を眺めていると円周率が計算されているWebサービスを作ってみた
今月の"作ってみたコーナー"は…
あ…ありのまま、今起こった事を話すぜ!
「おれは星空を横切る機関車を眺めていたと思ったらいつのまにか円周率が計算されていた」
な…何を言ってるのかわからねーと思うが、おれも何をされたのかわからなかった(AA略)
…そんなWebサービスです。(笑)
ネーミングの由来は推して知るべし!
ビュフォンの針って何?
まずは、例によってWikipediaから定義を引用…。
ビュフォンの針(Buffon's needle problem)は18世紀の博物学者ジョルジュ=ルイ・ルクレール、コント・ド・ビュフォンが提起した数学上の問題である。
もし床に平行な線をひいて、そこに針を落すならば、2本の線と針が交差する確率はどのようになるか
という事で、針を投げて平行線と交わったものの数を数えると、なぜだか円周率が計算できてしまうという、何とも不思議なお話です。*1 詳細な理論の説明についてはWikipedia先生に譲ります。
星空とビュフォンの針がどう結び付くの?
ビュフォンの針の話は、その名の通り、針を落として数を数えるというものなんですが、針が紙に落ちる様子をFlash化してもあまり面白味が無いので、今回は、落とす針を夜空の星に見立てたものにしてみました。
内部的には、仮想の平行線が引いてあるフィールドに仮想の針を落として、平行線と交わったかどうかを計算しています。画面上では、針1本が星1個に該当し、針の角度に応じて星の大きさを変えて、平行線と交わったと判定された星は黄色く表示しています。左端で星を生成して画面をスクロールさせて、星空っぽくしています。
ある程度の数(今回は200個)だけ星が生成されたら、平行線と交わったと判定された星の数をサーバに送って、サーバ側でビュフォンの針の式に当てはめて円周率を計算して、Flash側に返すようにしています。
サーバから計算結果を受け取ったら、それを機関車に載せて、右から左へ受け流し続けます。
ある意味分散コンピューティングだよね
クライアント(Flash)からサーバに送られた値は、サーバ側で蓄積されて円周率を計算するようになっているので、針を落として数える部分の処理をクライアントに任せている、ある種の分散コンピューティングとも言えるかもしれません。
ちなみにサーバ側での計算は、桁数を確保する為にBigDecimalで計算するようにしています。なので、理論上は(サーバの性能が許す限り)無限に桁数を計算できる…んですが、クライアント側の方は通常の数値型変数で計算するので、結局、あまり良い精度が得られる訳ではないかもしれません…。
雑感
普段、サーバ側のプログラムしか書かないので、Flash作るのになかなか苦労しました。どうにもイベントドリブンなプログラミングって苦手です…。
…なんて思っていたら、今月出たWEB+DB PRESSに、「JavaScript/Flash/HTML5でスパゲッティコードにならないためのモダン設計入門」なんて特集があるではないですか!?
- 作者: 桜井雅史,縣俊貴,西田圭介,青木靖,川口耕介,井奥雄一,冨田慎一,森田創,鶴岡直也,長野雅広,武者晶紀,富士慶,中山大輔,常澤邦幸,山?賢,近藤裕介,稲葉健二,Elaine Gan,久保田慎之介,酒井三保子,吉野哲仁,井野貴亮,朝日勝雅,伊藤直也,ミック,高林哲,小飼弾,羽生章洋,角田直行,はまちや2,岡野原大輔,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2009/10/24
- メディア: 大型本
- 購入: 6人 クリック: 194回
- この商品を含むブログ (38件) を見る
*1:現実世界でビュフォンの針をやろうとするとどうなるかは、こちらなんぞをどうぞ。→デイリーポータルZ:針を落とせば円周率