大学を卒業したばかりで、友人や家族とお祝いするために大きなパーティーを開きます。 70人以上が集まり、その中には少し風変わりなTedおじさんもいます。
いつものいたずらのひとつとして、Tedおじさんは、この部屋の少なくとも2人が同じ誕生日であると£100賭けてきます。 そんなはずはありません。誕生日の可能性は集まった人数よりずっと多いからです。そう思い、自信をもってその賭けに乗ります。
ところが、驚いたことに、32人分の誕生日を集めただけで、すでに同じ誕生日の2人組が見つかってしまいました。 負けを認めてTedおじさんに£100を渡しますが、何かが引っかかります。
翌日、好奇心には勝てません。 インターネットで少し検索すると、誕生日のパラドックスにたどり着きます。そこには、23人いるだけで同じ誕生日が存在する確率が50%を超えると書かれています。
ああ、_それ_がTedおじさんがあんなに自信満々だった理由なのですね。
今度は形勢を逆転させようと、ほかのパラドックスを調べ始めます。次は、賭けを持ちかけるのは_こちら_の番です。
誕生日のパラドックスは真実のパラドックスです。直感に反しているように感じられても、実際には正しいのです。
この演習のタスクは、誕生日のパラドックスの確率を見積もることです。
そのためには、次のことを行います。
生年月日は生まれた日そのもの(年・月・日)を指し、誕生日は月と日だけを指します。月と日は毎年巡ってきます。 同じ月と日の生年月日は、同じ誕生日にあたります。
誕生日のパラドックスは、次のことを前提としています。
実装はこの前提に従う必要があります。
関数random_birthdates()は、次の性質を持つ日付を生成する必要があります。
yとは、うるう年ではなく、1600 <= y < 2129を満たす年のことです。年と誕生日の両方の分布は、カイ二乗検定によって、p < 0.0001の水準で検証されます。
これは、指示どおりに日付を生成していれば、検定に失敗するような値の分布が得られる確率は0.01%未満であることを意味します。
Exercismに登録すれば、22個のコンセプト130個の演習、そして本物の人間によるメンタリングとともに、x86-64 Assemblyを学んでマスターできます。すべて無料です。