2006年04月27日

たけしのコマネチ大学数学科「モンテカルロ法」 @ テレビ

前回の「フィボナッチ」に続き、今回の番組のテーマは「モンテカルロ法」。広島では放送が1週間遅れなので、ネタバレとか気にしないで書きます。これから番組を見ようと思っている人はご注意下さい。

出題内容は「10分間のショーに水着モデルが1分間だけ登場します。カメラマンはそのショーの間、1分間だけ撮影が出来ます。カメラマンが水着モデルを一瞬でも撮影出来る確率は?」と言う内容です。

今回の「モンテカルロ法」もPerlのスクリプトにしてみました。乱数でモデルの登場時間とカメラマンの撮影開始時間を適当に作り、モデルが登場している時間とカメラマンの撮影が重なるかどうかを判定して、撮影出来た場合をカウントしています。回数が多いので、誤差は1%以下になると思います。

この様なケースではランダム関数を使って答えを導き出すというのは、馬鹿らしく見えますが、ランダムな数字から答えが出るという所がミソなんですよね。コンピュータだからこそ、何度も繰り返せるので、シミュレーションなどには丁度良いのです。以下のスクリプトでは100万回繰り返しているのですが、出題内容そのままを100万回繰り返すのは流石に現実的ではなく、更に問題が複雑になれば、尚更です。

-----8<-----キリトリ-----8<-----キリトリ-----8<-----
#!/usr/bin/perl

# たけしのコマネチ大学数学科
# 第二回 モンテカルロ法

$total = 1000000;
$count = 0;
for($i=0;$i<$total;$i++){
$girl = rand(9);
$camera = rand(9);
# print "$girl : $camera ";
$d = abs($girl - $camera);
if($d < 1){
# print " hit!!";
$count++;
}
# print "\n";
}

#計算結果
$ratio = ($count / $total)*100;
print $ratio."%\n";

#正解
$answer = (17/81)*100;
print $answer."%\n";

-----8<-----キリトリ-----8<-----キリトリ-----8<-----

このソースコードをそのまま試したいという人は少ないと思うのですが、簡単に説明を書いておきます。上記のソースコードを適当な名前で保存します。例えばmontecarlo.pl。改行コードはLF。文字コードはEUCが安全かな。ターミナルの表示文字コードと一致させた方が良いのですが、#で始まる行を全部削除すれば、文字コードはSJISだろうが、JISだろうが問題ないです。保存先はデスクトップとかが分かりやすいかな。ファイルを保存したらMac OS Xの場合は、Terminalを起動して下さい。起動したらcd Desktopでデスクトップへ移動。あとはperl montecarlo.pl とすればスクリプトが走ります。

20.9831%
20.9876543209877%

こんな感じで結果が表示されます。上がランダムに出した数値からの計算結果。下が本当の答えです。もっと精度を上げたい場合は$totalの数値を大きくすれば、計算回数が増えるので、もっと正解に近くなると思います。その代わり時間が掛かりますけどね。逆に小さくしても、良い結果が得られる時もあったりするので、その辺のさじ加減がこの方法の重要な部分かなと思います。

今回はPerlのランダム関数そのままを使ってますが、モンテカルロ法をやる場合は、ランダム関数の精度も重要だったりするので、本格的にやりたい人はその辺も調べて書き換えて下さい。

たけしのコマネチ大学数学科
>>関連リンク

こちらフジテレビ / News
>>関連リンク

竹内薫オフィシャルサイト
>>関連リンク

閲覧数: 4210 / はてなブックマークusers

関連商品

amazon.co.jp・詳細ページへ

blog comments powered by Disqus

関連日記

アマゾン広告

この日記ページは閲覧数などの条件に応じて、閲覧制限を行っています。他からリンクしていただいても、そのリンクから辿った閲覧者が当ページの内容をご覧頂けない場合があります。ご了承下さい。

▼日記検索

Mac

Shade

3D

Flash

ゲーム

ウェブ

音楽

映画

デジカメ

Windows

Linux

携帯電話

テレビ

広島

電子工作

iOS

▼ 最近のトラックバック

▼ランキング

▼関連サイト