同じ誕生日のパラドックス | 数学アラカルト [実践] | 逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓rpnの実践ウェブ   
rpn hacks! アールピーエヌ・ハックスサイトマップ

rpn | 実戦 | 数学アラカルト | 数学に関する話題をrpnで探求!数字と遊んでみよう。

HOME > 実践 > 数学アラカルト > 同じ誕生日のパラドックス hatena yahoo buzzurl livedoor del.icio.us nifty newsing twitter facebook rss ソーシャルブックマーク

同じ誕生日のパラドックス

  • 「エェーッ!同じ誕生日?こんな偶然は滅多にないよ。きっと運命だね」

好意を抱く異性の誕生日が自分と同じなら、奇跡が起こったと思うのも無理はありません。大切にしている自分の誕生日。その日と同じ日に生まれているなんて運命以外のなにものでもない…。そう思うと気分も舞い上がりそうですね。

滅多になさそうなことが起こるとき、本当にそうなのか実はよく起きることなのか疑って掛かる習慣は大切です。世の中のほとんどの出来事は、一昨日や昨日と変わり映えはなく、退屈でつまらないものです。

毎日が同じことの繰り返し…。何か起きないのかなぁ…っと。そこで、奇跡に期待したい思いが募り、余計に判断を迷わせるのかもしれません。

誕生日が一致する確率

 先ほどの話、一年は365日ですから、出会った二人が同じ日に生まれている確率は365分の1です。rpn式で計算すると次のようになります。

  >rpn 1 365 /
  0.00273973


甘く見積もって1000分の3の確率です。オフィス街で肩が触れ合って落とした書類。それを拾ってもらった異性と自分の誕生日が同じなら、それは運命かもしれません。最後にゴールインするなら本物です。

でも、クラス会のように多くの人が集まるうちの誰か同士が同じ誕生日だったというのなら、意外によくある出来事なのかもしれません。ここに面白いエピソードがあります。

注釈ある数学者が22人の将校との夕食会で、誕生日が重なる確率について話をしました。部屋の中に同じ誕生日の人がいる確率が高いと。そして、順番に誕生日を聞いていったものの、一人も同じ人がいません。これでは面目が丸つぶれです。ところが、偶然に居合わせたウェイトレスが窮地を救います。彼女の誕生日はまさに将校の一人と同じだったのです。

同一の誕生日を知る手順

 人数が増えるとどれくらいの割合で同じ誕生日の人がいるのでしょうか。実際にrpnで試してみましょう。まずは10人でシミュレーションしてみます。方法は1から365までの数字をランダムに発生させ、誕生日とします。同じ誕生日なら同じ数字というわけです。

以下のように-rオプションで10回繰り返せば簡単ですね。

  >rpn 365 ? -r 10
  118
  291
  219
  176
  3
  24
  176
  235
  264
  286


一番最初の118は1月1日から118日目ですから、以下のrpn式で月日が出てきます。2000年の1月1日を基準とすると以下のようになります。

  >rpn 20000101 163 -c dates
  20000428


118は2000年4月28日のことですね。このようにして得られた10行のデータがファイルの"birth.txt"にあるとします。まず、データを数字を小さいもの順(昇順)に並べ替えます。

  >rpn -c sort <birth.txt
  3
  24
  118
  176
  176
  219
  235
  264
  286
  291


その後、同じ数字が続く場合に1つに圧縮するユニーク処理を行ないます。

  >rpn -c sort <birth.txt | rpn -c uniq
  3
  24
  118
  176
  219
  235
  264
  286
  291


処理結果のデータ数は9個ですね。176が2つあったので省かれて1つになっています。このような処理を行なえば最後に10行なかったら同じ誕生日があったと判断できます。まとめると以下のrpn式になります。

  >rpn 365 ? -r 10 | rpn -c sort | rpn -c uniq | rpn -c count
  9


シミュレーションで誕生日が同じ確率を求める

 rpnのsortプログラムではなく、以下のようにDOSに標準装備されているsortコマンドを使っても構いません。

  >rpn 365 ? -r 10 | sort | rpn -c uniq | rpn -c count
  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
                               :
                             (中略)
                               :
  >rpn 365 ? -r 10 | sort | rpn -c uniq | rpn -c count >>tmp


実際のところ、手作業では大変なのでバッチファイルにします。バッチでは確実な乱数の初期化のため、1秒のスリープを各行の間に入れておきます。

  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
                               :
                             (中略)
                               :
  rpn 1 -c sleep
  rpn 365 ? -r 10 | sort | rpn -c uniq | rpn -c count >>tmp


バッチを実行するとtmpファイルにデータ数が保存されているはずです。さっそく、データ数が10の数を数えてみましょう。

  >rpn 10 10 -c lookup <tmp | rpn -c count
  90


結果は90です。従って、同じ誕生日だった割合は(100-90)÷100で10%になりますね。0から9の数を数えても同じく割合が計算できます。tmpファイルから割合まで一気に計算するなら次のrpn式です。

  >rpn 0 9 -c lookup <tmp | rpn -c count | rpn 100 /
  0.1


同じようにして、20人、30人、40人、50人、60人でシミュレーションしてみます。同じ誕生日の割合がどのように増えていくか想像してみてください。

人数が増えたときの同一誕生日の割合

 計算した10人から60人のシミュレーション結果が、それぞれファイルの"tmp10"から"tmp60"にあるとします。まとめて、pasteで横結合してみます。

  >paste tmp10 tmp20 tmp30 tmp40 tmp50 tmp60
  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 9 -c lookup <tmp10 | rpn -c count | rpn 100 / > ratio
  >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ファイルに計算結果が記録されています。数値と同時にグラフ化してみましょう。

  >type ratio
  0.1
  0.48
  0.71
  0.91
  0.93
  1


  >rpn 1 -c rownum <ratio | xyp -x,6 -y,1 -s1,.25 -m | npd
  ^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ミリの誤差もなく理論上の確率が計算できます。

シミュレーションの結果と確率計算で、違いは出るのでしょうか。

続き(part2)はこちらLinkIcon

情報誕生日の曜日に関する記事として、実践コーナー(統計アラカルト)の生まれる曜日は神様次第があります。興味のある人は参考にしてください。

警告rpnプログラムを実行するには、rpn試用版かrpn標準版が必要です(バージョンの違いはこちら)。

情報pasteは講座サポートで公開されています。dates, sleepはカレンダー・システムパッケージに同梱されています。sort, uniq, lookupはユーティリティパッケージに同梱されています。rownumはカンタン分析パッケージに同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。

数学アラカルト

数字と遊んでみよう

※実践コーナーのTOP

紹介 rpnの利用シーンはこちら…

講座初めての人のrpn基礎もどうぞ
講座しっかり学べるrpn入門もどうぞ
講座すぐに使えるdos入門もどうぞ

実践他の分野への挑戦は実践TOP

応用rpnアプリケーションは応用TOP

part2

数字と遊んでみよう

※実践コーナーのTOP

講座初めての人のrpn基礎もどうぞ
講座しっかり学べるrpn入門もどうぞ
講座すぐに使えるdos入門もどうぞ

実践他の分野への挑戦は実践TOP

応用rpnアプリケーションは応用TOP

書籍紹介

記事に関連した書籍

本ウェブサイトで扱った話題に関連した書物で、スタッフが実際に読了したものを紹介。

書籍数学の書籍
数の世界は思ったよりもエキサイティング。

  • 書籍統計の書籍
  • ビジネスで統計が使えるととっても有利。

書籍投資の書籍
失敗しない投資には広範囲で実践的な知識が必要。

警告バックスラッシュはエンマークに読み替えてください( IEのみ)。
バックスラッシュとエンマーク

警告文字で作られた図表や式が崩れることがあります。ブラウザによっては固定幅フォントをMSゴシックにするときれいに表示されます。それでも崩れる場合は図表や式をメモ帳にコピー後、閲覧下さい。

警告rpn試用版と標準版(2kリビジョン)はダブルクォートで囲ってください。

rpn 1 2 + ⇒ rpn "1 2 +"
rpn 1 -c foo ⇒ rpn "1" -c "foo"

ダブルクォートは省略できることが多いのですが、慣れない間は囲んだほうが無難です。なお、本ウェブサイトの記事ではrpn標準版(98リビジョン)を使用しているため囲っていません。詳しくは技術サポートの「rpn TIPS参照ください。

注意rpnの障害情報はこちら

警告rpn試用版の場合、複雑なプログラムや処理時間のかかるプログラムの一部には動作しないものがあるかもしれません。あくまで無料提供であることを勘案・了承ください。rpn標準版は、すべてのプログラムが動作します。