n人のグループ内で同じ誕生日のペアが少なくとも1組存在する確率

ふと聞いた話だと、23人ほど人が集まると、50%の確率で同じ誕生日のペアが存在するとか

今回はそれを検証してみました

まず1人では絶対に同じペアは存在しないし
366人以上だと必ず存在するので(うるう年は考えない)nの変域は
2 <= n <= 365 (1 < n < 366)

ざっくり数学的に計算したのがこのファイルです。
高校1年生の数学で十分理解できます。

Hobby mathematics001

さて、これをそれぞれのnの時に確率を求めるためにプログラムで計算させます。

[code language=”python” title=”same_birthday.py”]
print("Find the probability of existing at least one peer of same birth day in the group")
print("n: the number of people in a group")

no_match = 1
for n in range(2, 366):
no_match *= (366-n) / 365

print("n = %3d: %f" % (n, match))
[/code]

6行目が個人的にとても美しいと思ったところで
ループを回している中で前の値にそのままかけちゃえば、いちいちたくさん計算する必要がなくて効率的です

これを実行すると

Find the probability of existing at least one peer of same birth day in the group
n: the number of people in a group
n = 2: 0.002740
n = 3: 0.008204
n = 4: 0.016356
n = 5: 0.027136
n = 6: 0.040462
n = 7: 0.056236
n = 8: 0.074335
n = 9: 0.094624
n = 10: 0.116948
n = 11: 0.141141
n = 12: 0.167025
n = 13: 0.194410
n = 14: 0.223103
n = 15: 0.252901
n = 16: 0.283604
n = 17: 0.315008
n = 18: 0.346911
n = 19: 0.379119
n = 20: 0.411438
n = 21: 0.443688
n = 22: 0.475695
n = 23: 0.507297
n = 24: 0.538344
n = 25: 0.568700
n = 26: 0.598241
n = 27: 0.626859
n = 28: 0.654461
n = 29: 0.680969
n = 30: 0.706316
n = 31: 0.730455
n = 32: 0.753348
n = 33: 0.774972
n = 34: 0.795317
n = 35: 0.814383
n = 36: 0.832182
n = 37: 0.848734
n = 38: 0.864068
n = 39: 0.878220
n = 40: 0.891232
n = 41: 0.903152
n = 42: 0.914030
n = 43: 0.923923
n = 44: 0.932885
n = 45: 0.940976
n = 46: 0.948253
n = 47: 0.954774
n = 48: 0.960598
n = 49: 0.965780
n = 50: 0.970374
n = 51: 0.974432
n = 52: 0.978005
n = 53: 0.981138
n = 54: 0.983877
n = 55: 0.986262
n = 56: 0.988332
n = 57: 0.990122
n = 58: 0.991665
n = 59: 0.992989
n = 60: 0.994123
n = 61: 0.995089
n = 62: 0.995910
n = 63: 0.996604
n = 64: 0.997190
n = 65: 0.997683
n = 66: 0.998096
n = 67: 0.998440
n = 68: 0.998726
n = 69: 0.998964
n = 70: 0.999160
n = 71: 0.999321
n = 72: 0.999453
n = 73: 0.999561
n = 74: 0.999649
n = 75: 0.999720
n = 76: 0.999777
n = 77: 0.999824
n = 78: 0.999861
n = 79: 0.999891
n = 80: 0.999914

とずらずらと確率が出てきます。
次にこれをグラフに出したいと思います。

さっきのコードをにちょっと追加して

[code language=”python” title=”same_birthday2.py”]
import matplotlib.pyplot as plt
import numpy as np

print("Find the probability of existing at least one peer of same birth day in the group")
print("n: the number of people in a group")

x = np.linspace(2, 366, 364)
y = []
no_match = 1
for n in range(2, 366):
no_match *= (366-n) / 365
match = 1 – no_match
y.append(match)
print("n = %3d: %f" % (n, match))

plt.plot(x, y)
plt.show()
[/code]

便利なnumpyとmatplotlibの登場です。
x軸が人数(1<n<366)
y軸が確率です。

このプログラムを実行すると

こんなグラフが作られます。
50人いればほとんどの確率でいるんですねw

 

なにはともあれ、
確率求めて表示するだけならたった8行
グラフ追加してもたった17行

美しい
短いプログラムでできたときはとても嬉しいですね

 

最近、量子力学の影響で世の中を確率で見るようになってきたのでしばらく確率にはまっているかもしれませんw

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です