「誕生日のパラドックス」とは?23人で確率50%を超える数式と乱数ID・ハッシュ衝突の仕組みを解説

誕生日のパラドックスの確率計算と乱数ID衝突の仕組みを解説するアイキャッチ画像

確率論における「誕生日のパラドックス(Birthday Paradox / 誕生日問題)」とは、「何人集まれば、その中に誕生日が同じ2人(以上の組)がいる確率が50%を超えるか?」という問題に対し、1年が365日であるにもかかわらず、その答えが「23人(確率50.73%)」という少ない人数になる数学的性質を指します。

論理的な矛盾(誤り)があるわけではなく、計算上は厳密に証明された数学的事実です。この性質は単なる確率のパズルにとどまらず、システム開発における「乱数によるユニークID・受付番号の重複確率」や、暗号技術における「ハッシュ関数の衝突(誕生日攻撃)」を設計する上での基礎理論となっています。本記事では、23人で確率が50%を超える数式の仕組みから、一般化された「平方根(√N)の法則」、およびシステム設計への応用までを詳しく解説します。

この記事でわかること

  • 「特定の1人(自分)と同じ誕生日の人がいる確率」と「集団内の誰かと誰かが同じ誕生日になる確率」の構造的な違い
  • 余事象(全員の誕生日が異なる確率)を用いた具体的な計算式と人数別の確率一覧表
  • 全体の候補数Nに対して約 1.18 × √N 件で衝突確率が50%に達する「平方根の法則」
  • 乱数ID採番の重複回避や暗号学的ハッシュ関数(誕生日攻撃対策)における実務上の設計基準

「特定の1人との一致」と「任意のペアの一致」の構造的な違い

誕生日のパラドックスにおいて23人という少ない人数で確率が50%を超える理由は、比較対象が「特定の1人(たとえば自分)と他の人」ではなく、「集団の中にいる全員同士のあらゆるペア(組み合わせ)」であるためです。

特定の1人との一致と任意のペアの一致の構造比較を示した図解
図:「自分と同じ誕生日の人がいる確率(23人で5.86%)」と「誰かと誰かが同じ誕生日になる確率(23人で50.73%)」の比較

特定の1人(自分)と同じ誕生日の人がいる確率

1年を365日(うるう年を除き、各日の出生確率がすべて1/365で均等と仮定)とした場合、特定の1人(自分)と別の1人の誕生日が異なる確率は 364 / 365 です。23人の集団(自分以外の22人)の中で、22人全員が自分と異なる誕生日である確率は (364 / 365)^22 ≒ 0.9414 となり、自分と同じ誕生日の人が少なくとも1人いる確率は以下の通り 5.86% にとどまります。

// 23人の集団内で「自分」と同じ誕生日の人がいる確率
P = 1 - (364 / 365)^22
  = 1 - 0.94143...
  ≒ 0.05856(約 5.86%)

// 確率が50%を超えるために必要な人数 n
1 - (364 / 365)^(n - 1) >= 0.5
n - 1 >= log(0.5) / log(364 / 365) ≒ 252.65
n = 254人(自分以外に253人)

つまり、「自分と同じ誕生日の人」を50%以上の確率で見つけるには、自分以外に253人(合計254人)の比較対象が必要になります。

集団内の「誰かと誰か」が同じ誕生日になるペアの数

一方、誕生日のパラドックスが問うているのは「特定の誰か」ではなく、「集団内のどの2人でもよいので同じ誕生日になるペアが存在するか」です。人数が n 人のとき、その中から2人を選ぶペア(組み合わせ)の総数は n × (n - 1) / 2 で計算されます。

  • 2人の場合:2 × 1 ÷ 2 = 1組
  • 10人の場合:10 × 9 ÷ 2 = 45組
  • 23人の場合:23 × 22 ÷ 2 = 253組
  • 50人の場合:50 × 49 ÷ 2 = 1,225組

23人が集まると、そこには「253組」のペアが同時に成立します。先ほど「自分と同じ誕生日の人が50%を超えるには253人の相手が必要」と計算したのとちょうど同じ「253」という比較回数が、わずか23人のグループ内で発生するため、一致確率が50%を突破します。

余事象を使った確率の導出式と人数別の確率一覧

「少なくとも1組が同じ誕生日になる確率」を直接足し算で求めようとすると、「2人だけ一致する場合」「3人が一致する場合」「2組が別々に一致する場合」など複雑な場合分けが必要になります。そのため、確率論では全体(100% = 1)から「全員の誕生日が1日も被らずバラバラになる確率(余事象)」を引き算して求めます。

人数(n)の増加に伴うペア数と誕生日一致確率の推移を示した図解
図:23人(50.73%)、50人(97.04%)、70人(99.92%)におけるペア数と一致確率の推移

全員の誕生日がバラバラになる確率の計算ステップ

部屋に1人ずつ順番に入室するとき、既存のメンバーと誕生日が被らない確率を順番に掛け合わせます。

  • 1人目:まだ誰もいないため、365日のどの日でも被らない(確率:365 / 365)
  • 2人目:1人目の誕生日を除いた364日のどれかであれば被らない(確率:364 / 365)
  • 3人目:最初の2人の誕生日を除いた363日のどれかであれば被らない(確率:363 / 365)
  • n人目:すでにいる(n − 1)人の誕生日を除いた(365 − n + 1)日のどれかであれば被らない(確率:(365 - n + 1) / 365)

23人(n = 23)のとき、23人目は 343 / 365 です。これら23人分の分数をすべて掛け合わせると、全員が異なる誕生日になる確率 P(全員異なる) が算出されます。

// 23人全員の誕生日が異なる確率
P(全員異なる) = (365/365) × (364/365) × (363/365) × ... × (343/365)
              ≒ 0.492703(約 49.27%)

// 少なくとも1組が同じ誕生日になる確率(余事象)
P(一致あり)   = 1 - P(全員異なる)
              = 1 - 0.492703
              ≒ 0.507297(約 50.73%)

人数(n)ごとのペア数と誕生日一致確率の一覧表

人数 n を5人から366人まで変化させたときの、ペア数・全員異なる確率・少なくとも1組が一致する確率は以下の通りです。

人数(n) ペアの総数 n(n-1)/2 全員異なる確率 少なくとも1組が一致する確率
5人 10組 97.29% 2.71%
10人 45組 88.31% 11.69%
15人 105組 74.71% 25.29%
20人 190組 58.86% 41.14%
22人 231組 52.43% 47.57%
23人 253組 49.27% 50.73%(50%突破)
30人 435組 29.37% 70.63%
40人 780組 10.88% 89.12%
50人 1,225組 2.96% 97.04%
70人 2,415組 0.08% 99.92%
366人 66,795組 0.00% 100.00%(鳩の巣原理)

うるう年を除いた365日の前提では、366人が集まった時点で「鳩の巣原理(365個の箱に366個の玉を入れると、必ず2個以上入る箱が存在する原理)」により確率は100%になります。しかし実際には366人を待つまでもなく、70人の時点で一致確率は99.9%を超えます。

一般化モデル「平方根(√N)の法則」と乱数ID採番の衝突確率

誕生日のパラドックスの計算式は、365日という日数に限らず、「全部で N 通りの候補がある空間から、ランダムに k 個の要素を選んだときに重複(衝突)が発生する確率」へと一般化できます。

一般化モデル√Nの法則と乱数ID採番での衝突件数を示した図解
図:全体の候補数 N に対して約 1.18 × √N 件で50%の衝突が発生する法則と具体的数値

ネイピア数 e を使った近似式と「1.18 × √N」の導出

微積分のテイラー展開(x が十分に小さいとき 1 - x ≒ e^(-x))を利用すると、候補数 N の中から k 個をランダムに選んだ際の衝突確率は以下の式で近似できます。

// 候補数 N から k 個を選んだときに少なくとも1組が衝突する近似確率
P(衝突) ≒ 1 - exp( - k × (k - 1) / (2 × N) )

// P(衝突) = 0.5(確率50%)となる件数 k を解くと:
k(k - 1) / (2N) = ln(2) ≒ 0.69315
k ≒ √(2 × N × ln(2))
k ≒ 1.1774 × √N

この 「k ≒ 1.18 × √N」 という式が示す通り、ランダムに値を選ぶシステムでは、全体の候補数 N の半分(N / 2)ではなく、候補数 N の平方根(√N)をわずかに超えた件数で、重複が発生する確率が50%に達します。

乱数で受付番号やユニークIDを発行した場合の衝突シミュレーション

この法則を、Webシステムやフォームの受付番号(乱数による自動採番)に当てはめて計算すると、以下の結果になります。

乱数の桁数・空間サイズ(N) 衝突確率10%に達する件数 衝突確率50%に達する件数(1.18√N) 衝突確率99%に達する件数
4桁の乱数(1万通り) 約 46件 約 118件 約 303件
6桁の乱数(100万通り) 約 459件 約 1,177件 約 3,035件
先頭1〜9の7桁乱数(900万通り) 約 1,378件 約 3,533件 約 9,105件
8桁の乱数(1億通り) 約 4,590件 約 11,774件 約 30,349件

たとえば900万通りの候補がある7桁の乱数であっても、単純な Math.random() で採番すると、わずか 3,533件 発行した時点で50%の確率で番号の重複が発生し、1万件発行した時点での重複発生確率は 99.6% に達します。

システム開発・暗号技術における誕生日のパラドックス対策

この数学的性質を踏まえ、実際のソフトウェア開発やセキュリティ設計では、用途に応じて以下の3つの対策アプローチが使い分けられています。

システム開発・暗号技術における誕生日のパラドックス対策(連番×数式シャッフル・暗号学的ハッシュ・UUID v4)の図解
図:誕生日のパラドックスによる衝突を防ぐ3つのエンジニアリング手法

短い桁数の受付番号には「連番×互いに素のシャッフル」を使う

お客様が入力・確認しやすい6桁〜8桁程度の短い番号を発行したい場合、乱数を使うと誕生日のパラドックスによって早期に衝突が起きます。これを回避するには、乱数ではなく「1, 2, 3…」という連番を入力値とし、全体の範囲 N と「互いに素」な定数を掛けて余りをとる全単射(1対1対応)のシャッフル関数を使用します。

この方式であれば、見た目はランダムな数字列でありながら、数学的に N 件目(たとえば900万件目)に達するまで衝突確率を 0% に保つことができます。Google Apps Script(GAS)を用いた具体的な8桁採番の実装コードについては、GASで重複しない8桁の受付番号を自動採番する仕組み|数学的シャッフルとチェックデジットの実装手順を解説で詳しく紹介しています。

暗号学的ハッシュ関数における「誕生日攻撃(Birthday Attack)」への対策

デジタル署名や改ざん検知に使われるハッシュ関数において、同じハッシュ値になる2つの異なるデータを探索する手法を「誕生日攻撃(Birthday Attack)」と呼びます。

  • 出力長が b ビットのハッシュ関数には N = 2^b 通りの出力が存在しますが、誕生日のパラドックス(√Nの法則)により、約 2^(b/2) 回 のハッシュ計算を行えば高い確率で衝突ペアが見つかります。
  • たとえば64ビットのハッシュ(2^64 通り)では、その平方根である 2^32(約43億回)の試行で衝突が発生するため、現代のコンピュータでは数秒以内に突破されます。
  • そのため、現在のセキュリティ標準である SHA-256(256ビット)や SHA-3 では、平方根をとっても 2^128 回(約 3.4 × 10^38 回)の計算が必要となるよう、十分に長いビット長が設計されています。

分散システムでの乱数ID(UUID v4)における空間サイズの確保

複数のサーバー間で中央の連番管理なしにランダムなIDを発行したい場合は、平方根 √N 自体が天文学的な数値になるまで候補空間 N を広げるアプローチをとります。

代表的な規格である UUID v4(128ビットのうちランダム領域が122ビット、候補数 N = 2^122 ≒ 5.3 × 10^36 通り)では、衝突確率が50%に達する件数は 1.18 × 2^61 ≒ 2.71 × 10^18(約271京件)となります。毎秒10億個のUUIDを生成し続けたとしても、衝突確率が50%に達するまでに約86年を要するため、実務上は重複を無視できる水準として扱われます。

まとめ:誕生日のパラドックスの数学的要点

誕生日のパラドックスの仕組みと、システム設計における要点は以下の通りです。

本記事の要点まとめ

  • n人の集団内で作れるペアの総数は n(n-1)/2 で増加し、23人で253組のペアが成立するため、同じ誕生日のペアが存在する確率は 50.73% となる(50人で 97.04%、70人で 99.92%)
  • 「特定の1人(自分)と同じ誕生日の人がいる確率」は 1 – (364/365)^(n-1) であり、23人では 5.86%(50%突破には254人が必要)となる
  • 全体の候補数が N 通りの空間からランダムに要素を選ぶ場合、約 1.18 × √N 件で衝突発生確率が50%に達する
  • 6桁〜8桁などの短い番号体系では乱数による採番は早期に衝突を起こすため、「連番×互いに素のシャッフル」を用い、乱数IDやハッシュ関数ではUUID v4やSHA-256のように √N が十分に大きくなるビット長を採用する

eguchi.netをもっと見る

購読すると最新の投稿がメールで送信されます。