トラック
/
x86-64 Assembly
x86-64 Assembly
/
演習
/
不可解な誕生日
不可解な誕生日

不可解な誕生日

中級

はじめに

大学を卒業したばかりで、友人や家族とお祝いするために大きなパーティーを開きます。 70人以上が集まり、その中には少し風変わりなTedおじさんもいます。

いつものいたずらのひとつとして、Tedおじさんは、この部屋の少なくとも2人が同じ誕生日であると£100賭けてきます。 そんなはずはありません。誕生日の可能性は集まった人数よりずっと多いからです。そう思い、自信をもってその賭けに乗ります。

ところが、驚いたことに、32人分の誕生日を集めただけで、すでに同じ誕生日の2人組が見つかってしまいました。 負けを認めてTedおじさんに£100を渡しますが、何かが引っかかります。

翌日、好奇心には勝てません。 インターネットで少し検索すると、誕生日のパラドックスにたどり着きます。そこには、23人いるだけで同じ誕生日が存在する確率が50%を超えると書かれています。

ああ、_それ_がTedおじさんがあんなに自信満々だった理由なのですね。

今度は形勢を逆転させようと、ほかのパラドックスを調べ始めます。次は、賭けを持ちかけるのは_こちら_の番です。

Note

誕生日のパラドックスは真実のパラドックスです。直感に反しているように感じられても、実際には正しいのです。

説明

この演習のタスクは、誕生日のパラドックスの確率を見積もることです。

そのためには、次のことを行います。

  • 生年月日をランダムに生成します。
  • ランダムに生成した生年月日のコレクションの中に、同じ誕生日のものが少なくとも2つ含まれているかどうかを調べます。
  • グループの人数を変えながら、その中に同じ誕生日の人が少なくとも2人いる確率を見積もります。
Note

生年月日は生まれた日そのもの(年・月・日)を指し、誕生日は月と日だけを指します。月と日は毎年巡ってきます。 同じ月と日の生年月日は、同じ誕生日にあたります。

Caution

誕生日のパラドックスは、次のことを前提としています。

  • 誕生日は365通りある(うるう年はありません)。
  • どの誕生日も同じ確率で起こる(一様分布)。

実装はこの前提に従う必要があります。

x86-64アセンブリ固有の注意点

関数random_birthdates()は、次の性質を持つ日付を生成する必要があります。

  1. その年は有効でなければなりません。 有効な年yとは、うるう年ではなく、1600 <= y < 2129を満たす年のことです。
  2. 年は、有効な値の範囲全体にわたって一様に分布します。
  3. 誕生日は、1年の365日すべてにわたって一様に分布します。つまり、どの暦日も同じ確率で選ばれます。 このことは、月が同じ確率では_ない_ということを意味します。31日の月は30日の月より確率が高く、どちらも2月より確率が高いです。

年と誕生日の両方の分布は、カイ二乗検定によって、p < 0.0001の水準で検証されます。

これは、指示どおりに日付を生成していれば、検定に失敗するような値の分布が得られる確率は0.01%未満であることを意味します。

GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
x86-64 Assembly Exercism

不可解な誕生日を始める準備はできましたか?

Exercismに登録すれば、22個のコンセプト130個の演習、そして本物の人間によるメンタリングとともに、x86-64 Assemblyを学んでマスターできます。すべて無料です。