カウンター

2013年5月12日日曜日

誕生日のパラドックスその2


その2です。
これは、「同じクラスに、同じ誕生日の人がいる確率は?」という問題でした。
直感的には、1年365日なのでとても確率が低そうに見えます。

その1だと、同じ誕生月の人がいるか、という考察しかしていなかったので
今回きちんと解を算出したいと思います。


普通に解いても面白く無いので、今回PRISMというツールを利用して解析したいと思います。
学生時代研究で利用していたのですが、確率モデルを解析するツールです。

参考までに、公式ページです。
http://www.prismmodelchecker.org/


まず確率モデルを設計していきます。
PRISMで書くと下記になります。















=================================
文法を簡単に説明します。
dtmcってのは、モデルの種類を定義していて、今回は
「Discrete-Time Markov Chain(離散時間マルコフ連鎖)」というモデルです。
定数をNで定義し、モデルの変数を8行目~9行目で定義しています。
実際の遷移定義は13行目~16行目です。
例えば、ある状態から、0.3で遷移先状態①に遷移し、
0.7の確率で遷移先状態②に遷移する場合、下記のように記述します。

【ある状態】 -> 0.3 : 【遷移先状態①】 + 0.7 : 【遷移先状態②】
=================================

単純に"N"人分誕生日を同じか確認していく、というモデルです。

今回の問題は、普通に解くと場合分けが必要なのですが、
それを考えなくていいように、"day"という変数を使って、
 誕生日が同じ⇒dayを減らさない
 誕生日が違う⇒dayを減らす
という方法で「任意の誰かが誕生日が同じであるかどうか」
を解くようにしています。

各変数の意味:
 s   : "1"の時、計算終了状態
 n   : 誕生日確認済み人数
  day : 誕生日が違う人がいると-1される
 m   : 誕生日が同じ人の数

13行目が最もメインで、
 誕生日が違う場合は、dayを減らし、残りの確認人数nを減らします。
 誕生日が同じ場合は、誕生日が同じ人の数mを増やし、残りの確認人数nを減らします。
ってな感じです。
14行目は、「すべての誕生日で同じペアが存在した」という状態を想定しており、
確率1で遷移します。で、人数nが0になったら状態s=1に遷移し、計算を終了します。


では、計算してみましょう。

PRISMは、「モデルに対してある性質を満たす確率を計算する」ツールです。
今回は、「s=1かつmが1以上の状態に到達する確率」を求めることで、誕生日のパラドックスを解きたいと思います。


またPRISMでは、定数をある範囲で動かして、各値での計算結果をグラフに
出してくれます。便利ですね。

今回は、クラスにいる人数をNとしていますので、クラス内の人数を
3~100で動かしてみましょう。


40人のクラスだと、ほぼ90%ですね。
(値としては0.891でした)

問題を解くよりは「PRISMの紹介」メインになってしまいましたが、
同じ誕生日がいる確率って結構高いんですね。

私は自分と同じ誕生日の人に出会ったこと無いので、
この結果は信じておりませんがw


0 件のコメント:

コメントを投稿