お知らせ

ただいま、シンタックスハイライターの設定を見直しております。
プログラムが見にくくなっているページがありますが、ご容赦ください。

クラスの中に同じ誕生日の人は何組あるの?その確率は?

モデル化とシミュレーション

こんにちは。モデル化とシミュレーションの授業で、生徒から意外な結果が出たと教えてもらったので検証してみることにします。誕生日ネタです。

クラスの中に誕生日が同じ人がいる確率

ようやく数学シリーズが終わったのに、またまた数学の話で申し訳ありません。数学の教科書などの読み物などで「クラスの中に誕生日が同じ人がいる確率はどれくらいあるか?」ということが取り上げられることが多くあります。この確率は問題どおり考えると、2人が同じ誕生日の場合もあるし、3人が同じ誕生日の場合もあるし、2人×2組が同じ誕生日の場合もあるし、・・・と場合分けがとんでもないことになります。数学ではこのような場合、余事象という考え方を使って解きます。余事象とは「○○が起こらない」という事象のことで、今回の誕生日の問題の場合には、「クラスの中に誕生日が同じ人がいない」事象になります。事象\(A\)に対して余事象を\(\overline{A}\)と表し、余事象の確率を用いて事象\(A\)の確率を求めるには

\[ P(A)=1-P(\overline{A}) \]

であることが知られています。ここで、このクラスの生徒の生まれた年がうるう年ではなく、40人クラスの場合について考えていきます。一人ずつ順に、既に誕生日を確認した生徒と同じにならない確率を考えていけば求まります。

まず1人目は365日のどの日でも大丈夫です。確率は\(\frac{365}{365}=1\)です。1人だけなら絶対に重なることはないので、当然の結果です。

次に2人目までが同じ誕生日にならない確率を考えます。1人目と誕生日が重ならなければよいので1人目と異なる364日のいずれかの日であればよいので、確率は\(\frac{365}{365} \times \frac{364}{365} \sim 0.9973 \)です。2人が異なる誕生日が約99.7%なのも概ね予想通りだと思います。

さらに3人目までが誕生日が重ならない確率を考えます。1人目と2人目の誕生日が重ならず、かつ3人目は1人目・2人目ともに重ならない誕生日ということになります。そうすると3人目は1人目・2人目と異なる残り363日のいずれかの日であればよいので、確率は\(\frac{365}{365} \times \frac{364}{365} \times \frac{363}{365} \sim 0.9918 \)です。約99.2%と若干確率が下がりましたが、ほとんど重なりません。

人数が増えたら同様の考えで計算していけば、確率を求めることができます。40人の誕生日が重ならない確率は、

\[P(\overline{A}) = \frac{365}{365} \times \frac{364}{365} \times \cdots \times \frac{365-40+1}{365} =\frac{365}{365} \times \frac{364}{365} \times \cdots \times \frac{326}{365} \sim 0.1088 \]

です。約10.9%しか重ならないことがわかりました。

よって、40人の誕生日が重ならない確率は

\[ P(A)=1-P(\overline{A}) \sim 1 -0.1088 =0.8912 \]

です。約89.1%の確率でクラスの中に同じ誕生日の人がいることが計算により求められました。この数値を知っていたので、担任として書類を整理しているときに誕生日を気にしていましたが、概ね合っているように感じます。

一応、この確率を求めるために作ったプログラムを掲載しておきます。毎度おなじみのPythonです。

n = 40
p = 1
d = 365

for i in range(n):
    p *= ( d/365 )
    d -= 1
    print('{0:>2}人 余事象の確率{1:.4f} 同じ人がいる確率{2:.4f}'
          .format( i+1, p, 1-p ))

参考として結果を載せておきます。参考として、上のプログラムでn=50として実行した結果です。

 1人 余事象の確率1.0000 同じ人がいる確率0.0000
 2人 余事象の確率0.9973 同じ人がいる確率0.0027
 3人 余事象の確率0.9918 同じ人がいる確率0.0082
 4人 余事象の確率0.9836 同じ人がいる確率0.0164
 5人 余事象の確率0.9729 同じ人がいる確率0.0271
 6人 余事象の確率0.9595 同じ人がいる確率0.0405
 7人 余事象の確率0.9438 同じ人がいる確率0.0562
 8人 余事象の確率0.9257 同じ人がいる確率0.0743
 9人 余事象の確率0.9054 同じ人がいる確率0.0946
10人 余事象の確率0.8831 同じ人がいる確率0.1169
11人 余事象の確率0.8589 同じ人がいる確率0.1411
12人 余事象の確率0.8330 同じ人がいる確率0.1670
13人 余事象の確率0.8056 同じ人がいる確率0.1944
14人 余事象の確率0.7769 同じ人がいる確率0.2231
15人 余事象の確率0.7471 同じ人がいる確率0.2529
16人 余事象の確率0.7164 同じ人がいる確率0.2836
17人 余事象の確率0.6850 同じ人がいる確率0.3150
18人 余事象の確率0.6531 同じ人がいる確率0.3469
19人 余事象の確率0.6209 同じ人がいる確率0.3791
20人 余事象の確率0.5886 同じ人がいる確率0.4114
21人 余事象の確率0.5563 同じ人がいる確率0.4437
22人 余事象の確率0.5243 同じ人がいる確率0.4757
23人 余事象の確率0.4927 同じ人がいる確率0.5073
24人 余事象の確率0.4617 同じ人がいる確率0.5383
25人 余事象の確率0.4313 同じ人がいる確率0.5687
26人 余事象の確率0.4018 同じ人がいる確率0.5982
27人 余事象の確率0.3731 同じ人がいる確率0.6269
28人 余事象の確率0.3455 同じ人がいる確率0.6545
29人 余事象の確率0.3190 同じ人がいる確率0.6810
30人 余事象の確率0.2937 同じ人がいる確率0.7063
31人 余事象の確率0.2695 同じ人がいる確率0.7305
32人 余事象の確率0.2467 同じ人がいる確率0.7533
33人 余事象の確率0.2250 同じ人がいる確率0.7750
34人 余事象の確率0.2047 同じ人がいる確率0.7953
35人 余事象の確率0.1856 同じ人がいる確率0.8144
36人 余事象の確率0.1678 同じ人がいる確率0.8322
37人 余事象の確率0.1513 同じ人がいる確率0.8487
38人 余事象の確率0.1359 同じ人がいる確率0.8641
39人 余事象の確率0.1218 同じ人がいる確率0.8782
40人 余事象の確率0.1088 同じ人がいる確率0.8912
41人 余事象の確率0.0968 同じ人がいる確率0.9032
42人 余事象の確率0.0860 同じ人がいる確率0.9140
43人 余事象の確率0.0761 同じ人がいる確率0.9239
44人 余事象の確率0.0671 同じ人がいる確率0.9329
45人 余事象の確率0.0590 同じ人がいる確率0.9410
46人 余事象の確率0.0517 同じ人がいる確率0.9483
47人 余事象の確率0.0452 同じ人がいる確率0.9548
48人 余事象の確率0.0394 同じ人がいる確率0.9606
49人 余事象の確率0.0342 同じ人がいる確率0.9658
50人 余事象の確率0.0296 同じ人がいる確率0.9704

なお、誕生日が同じ人がクラスの中にいる確率が50%を超えるのは、23人以上であることが、上の結果からわかります。

同じ誕生日の人の組がが何組あるの?

さて、いよいよ本題です。同じ誕生日の組は何組できるのでしょうか?また、3人が同じ誕生日だったり、4人が同じ誕生日だったり、もしかしてクラス全員が同じ誕生日だったり、という確率がどの程度になるかを求めてみたいと思います。生徒はExcelを駆使して求めていましたが、あまりにも実行速度が遅すぎるので、Pythonでプログラムを書きました。(Pythonも早いとはいえませんが・・・)クラスの生徒の誕生日は1~365を乱数を用いて生成します。100万クラス作ってみて、何人が同じ誕生日で、それが何組できたかを数えてみました。

import random

number_of_people = 40		# クラス生徒の人数
number_of_trials = 1000000	# シミュレーション回数
leap_year = 0				# うるう年の場合は1,うるう年でない場合は0
count = [ [ 0 for i in range(number_of_people+1) ] for j in range(number_of_people+1) ]

for try_time in range( number_of_trials ):
	sameday = [0] * (number_of_people+1)

	birthday =[]
	for i in range( number_of_people ):
		birthday.append( random.randint( 1, 365+leap_year ) )

	while len(birthday)>0:
		day = birthday[0]
		sameday[ birthday.count(day) ] += 1
		while day in birthday:
			birthday.remove( day )

	for i, x in enumerate( sameday ):
		count[i][x] += 1

print( '{0}回シミュレーションした結果を表示します'.format( number_of_trials ) )
for member in range( 2, number_of_people+1 ):
	for couple in range( 1, int(number_of_people/member)+1 ):
		if count[member][couple]!=0:
			print('{0}人が同じ誕生日になるのが、{1:>2}組だったのは{2:>6}回ありました。確率は{3:.4f}です'
				.format( member, couple, count[member][couple], count[member][couple]/number_of_trials ))

上のプログラムでは、生徒の人数・シミュレーション回数・うるう年か否かをパラメータで与えられるようになっています。興味に合わせて変えてみてください。

上のプログラムの結果です。

1000000回シミュレーションした結果を表示します
2人が同じ誕生日になるのが、 1組だったのは282084回ありました。確率は0.2821です
2人が同じ誕生日になるのが、 2組だったのは299514回ありました。確率は0.2995です
2人が同じ誕生日になるのが、 3組だったのは189077回ありました。確率は0.1891です
2人が同じ誕生日になるのが、 4組だったのは 80001回ありました。確率は0.0800です
2人が同じ誕生日になるのが、 5組だったのは 23575回ありました。確率は0.0236です
2人が同じ誕生日になるのが、 6組だったのは  5031回ありました。確率は0.0050です
2人が同じ誕生日になるのが、 7組だったのは   857回ありました。確率は0.0009です
2人が同じ誕生日になるのが、 8組だったのは    97回ありました。確率は0.0001です
2人が同じ誕生日になるのが、 9組だったのは     8回ありました。確率は0.0000です
2人が同じ誕生日になるのが、10組だったのは     1回ありました。確率は0.0000です
3人が同じ誕生日になるのが、 1組だったのは 63411回ありました。確率は0.0634です
3人が同じ誕生日になるのが、 2組だったのは  1735回ありました。確率は0.0017です
3人が同じ誕生日になるのが、 3組だったのは    20回ありました。確率は0.0000です
4人が同じ誕生日になるのが、 1組だったのは  1711回ありました。確率は0.0017です
4人が同じ誕生日になるのが、 2組だったのは     1回ありました。確率は0.0000です
5人が同じ誕生日になるのが、 1組だったのは    39回ありました。確率は0.0000です
6人が同じ誕生日になるのが、 1組だったのは     1回ありました。確率は0.0000です

なんと、2人が同じ誕生日の組が2組できる確率が約30.0%、1組できる確率は約28.2%で、2組の方が1組よりも高確率であることが求められました。生徒がExcelでシミュレーションしたときも、ほとんど同じ結果が得られていました。

極稀ですが、2人同じ誕生日の組が10組できたり、6人が同じ誕生日だったりということも起きていました。

シミュレーションでの確率は誤差があることを踏まえて捉える必要がありますが、手計算で確率を求めていたのでは気が付かないことを見つけるには有用な手法だと思います。

私の誕生日はイベントが少ない季節ですが、年末年始に生まれた人は、クリスマスや正月などと混ぜこぜにされたり、冬休み中だったりしてちゃんとお祝いされるんでしょうか?とシミュレーションできない疑問が湧いてきたところでおしまいにします。それではまた。

この記事を書いた人
春日井 優

高校で情報科という教科を担当しています。以前は数学科も担当していました。(今でも数学科の教員免許状は有効です。)プログラムを覚えたのは、「ゲームセンターあらし」という漫画のキャラクターがBASICを解説する「こんにちはマイコン」を読んだことがきっかけでした。

Posted by kasugai