同じ誕生日のパラドックス
- 「エェーッ!同じ誕生日?こんな偶然は滅多にないよ。きっと運命だね」
好意を抱く異性の誕生日が自分と同じなら、奇跡が起こったと思うのも無理はありません。大切にしている自分の誕生日。その日と同じ日に生まれているなんて運命以外のなにものでもない…。そう思うと気分も舞い上がりそうですね。
滅多になさそうなことが起こるとき、本当にそうなのか実はよく起きることなのか疑って掛かる習慣は大切です。世の中のほとんどの出来事は、一昨日や昨日と変わり映えはなく、退屈でつまらないものです。
毎日が同じことの繰り返し…。何か起きないのかなぁ…っと。そこで、奇跡に期待したい思いが募り、余計に判断を迷わせるのかもしれません。
誕生日が一致する確率
先ほどの話、一年は365日ですから、出会った二人が同じ日に生まれている確率は365分の1です。rpn式で計算すると次のようになります。
0.00273973
甘く見積もって1000分の3の確率です。オフィス街で肩が触れ合って落とした書類。それを拾ってもらった異性と自分の誕生日が同じなら、それは運命かもしれません。最後にゴールインするなら本物です。
でも、クラス会のように多くの人が集まるうちの誰か同士が同じ誕生日だったというのなら、意外によくある出来事なのかもしれません。ここに面白いエピソードがあります。
ある数学者が22人の将校との夕食会で、誕生日が重なる確率について話をしました。部屋の中に同じ誕生日の人がいる確率が高いと。そして、順番に誕生日を聞いていったものの、一人も同じ人がいません。これでは面目が丸つぶれです。ところが、偶然に居合わせたウェイトレスが窮地を救います。彼女の誕生日はまさに将校の一人と同じだったのです。
同一の誕生日を知る手順
人数が増えるとどれくらいの割合で同じ誕生日の人がいるのでしょうか。実際にrpnで試してみましょう。まずは10人でシミュレーションしてみます。方法は1から365までの数字をランダムに発生させ、誕生日とします。同じ誕生日なら同じ数字というわけです。
以下のように-rオプションで10回繰り返せば簡単ですね。
118
291
219
176
3
24
176
235
264
286
一番最初の118は1月1日から118日目ですから、以下のrpn式で月日が出てきます。2000年の1月1日を基準とすると以下のようになります。
20000428
118は2000年4月28日のことですね。このようにして得られた10行のデータがファイルの"birth.txt"にあるとします。まず、データを数字を小さいもの順(昇順)に並べ替えます。
3
24
118
176
176
219
235
264
286
291
その後、同じ数字が続く場合に1つに圧縮するユニーク処理を行ないます。
3
24
118
176
219
235
264
286
291
処理結果のデータ数は9個ですね。176が2つあったので省かれて1つになっています。このような処理を行なえば最後に10行なかったら同じ誕生日があったと判断できます。まとめると以下のrpn式になります。
9
シミュレーションで誕生日が同じ確率を求める
rpnのsortプログラムではなく、以下のようにDOSに標準装備されているsortコマンドを使っても構いません。
9
データ数が9なので1つ重複があったことを示しています。この作業を100回繰り返してみましょう。データ数が10個ない割合を求めれば、誕生日が一致する割合になります。
>rpn 365 ? -r 10 | sort | rpn -c uniq | rpn -c count >>tmp
:
(中略)
:
>rpn 365 ? -r 10 | sort | rpn -c uniq | rpn -c count >>tmp
実際のところ、手作業では大変なのでバッチファイルにします。バッチでは確実な乱数の初期化のため、1秒のスリープを各行の間に入れておきます。
rpn 1 -c sleep
rpn 365 ? -r 10 | sort | rpn -c uniq | rpn -c count >>tmp
:
(中略)
:
rpn 1 -c sleep
rpn 365 ? -r 10 | sort | rpn -c uniq | rpn -c count >>tmp
バッチを実行するとtmpファイルにデータ数が保存されているはずです。さっそく、データ数が10の数を数えてみましょう。
90
結果は90です。従って、同じ誕生日だった割合は(100-90)÷100で10%になりますね。0から9の数を数えても同じく割合が計算できます。tmpファイルから割合まで一気に計算するなら次のrpn式です。
0.1
同じようにして、20人、30人、40人、50人、60人でシミュレーションしてみます。同じ誕生日の割合がどのように増えていくか想像してみてください。
人数が増えたときの同一誕生日の割合
計算した10人から60人のシミュレーション結果が、それぞれファイルの"tmp10"から"tmp60"にあるとします。まとめて、pasteで横結合してみます。
10 19 29 36 45 53
10 20 29 39 44 54
10 19 28 39 46 58
:
(中略)
:
10 20 30 38 48 55
10 19 29 37 50 54
10 19 29 36 47 57
もし誕生日が重なっていないなら、横方向に10、20、30、40、50、60になるはずなのですが、パッと見ても人数が増えると誕生日が重なる割合が増えるのが分かりますね。
それでは、誕生日が重なる割合を計算してみましょう。
>rpn 0 19 -c lookup <tmp20 | rpn -c count | rpn 100 / >>ratio
>rpn 0 29 -c lookup <tmp30 | rpn -c count | rpn 100 / >>ratio
>rpn 0 39 -c lookup <tmp40 | rpn -c count | rpn 100 / >>ratio
>rpn 0 49 -c lookup <tmp50 | rpn -c count | rpn 100 / >>ratio
>rpn 0 59 -c lookup <tmp60 | rpn -c count | rpn 100 / >>ratio
ratioファイルに計算結果が記録されています。数値と同時にグラフ化してみましょう。
0.1
0.48
0.71
0.91
0.93
1
^y 100% *
| * *
|
- 75%
| *
|
|
- 50% *
|
|
|
- 25%
|
| *
|o x
+-----|------|-----|------|------|----->
10人 20人 30人 40人 50人 60人
予想と一致しましたか。直線で割合が増えるのではなく、20人くらいから急激に確率が増えていきますね。20人くらいで50%です。60人にもなるとほぼ100%です。
どんな人でも何か起こる確率が50%くらいなら別に希な出来事とは思いません。1年は365日あるわけですから(うるう年は省く)、同じ誕生日の確率が50%を超えるには365日×50%で182.5人くらい必要な感じがしますが、たったの20人でよいことになります。
このような感覚的な矛盾が生じることから、この問題を誕生日のパラドックスとも言います。
次は…
シミュレーションの結果から、たくさんの人がいれば同じ誕生日になる確率は思いのほか高いことが分かりました。ただ、あくまでシミュレーションなのでばらつきも発生します。計算結果の確率は偶然かもしれません。
実は誕生日のパラドックス問題はシミュレーションするまでもなく、純粋に数学の確率で計算できます。これなら1ミリの誤差もなく理論上の確率が計算できます。
シミュレーションの結果と確率計算で、違いは出るのでしょうか。
誕生日の曜日に関する記事として、実践コーナー(統計アラカルト)の生まれる曜日は神様次第があります。興味のある人は参考にしてください。
rpnプログラムを実行するには、rpn試用版かrpn標準版が必要です(バージョンの違いはこちら)。
pasteは講座サポートで公開されています。dates, sleepはカレンダー・システムパッケージに同梱されています。sort, uniq, lookupはユーティリティパッケージに同梱されています。rownumはカンタン分析パッケージに同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。