ぱそきいろのIT日記

ぱそきいろがITに関する記事を書いていきます。

日向坂46に同じ誕生日の人はいるのか(誕生日のパラドックス)

こんばんは、ぱそきいろです。
モンティホール問題に続いて誕生日のパラドックスをPythonで試していきます。
タイトルの日向坂は現在22人です。
直感で同じ誕生日はいなさそうですが。。。笑
よろしくお願いします。

誕生日のパラドックス

何人集まれば、その中に誕生日が同一の2人(以上)がいる確率が、50%を超えるか?

誕生日のパラドックス - Wikipedia

直感でどれくらいだと思いますか?
最初聞いたときは直感で100人くらいと思った気がします。
正解は23人です。
(解説はwikipediaを見てください)
「自分と他の22人」とみるから確率が低そうに思えるだけで、「その他の人と、他の22人」も同じ可能性があるので23人でも同じ誕生日の人がいるんですね。
(日向坂は22人だから微妙なところ...!)

方針

i人の誕生日を生成します。
その中に同じ誕生日の人が複数いるかを調べます。
それを1万回繰り返して、誕生日が同じになる確率を調べます。
i人を1~70人まで増やしてどのように確率が変わるかを可視化します。

コード

上記の方針をコードにしていきます。
別に日付型にする必要がなく
「1~365の数字をi個生成して、重複があるか」
という問題に落とし込めるのですが、問題の雰囲気を尊重して日付型で生成します。笑

if __name__ == '__main__':
    #別に日付型を使う必要がないのですが、問題文に合わせておきます。笑
    firstdate=datetime.datetime(2020,4,1)
    birthdays=[]
    output=[]
    n=10000
    classnum=70
    #クラスの人数を0~70人まで増やす
    for i in range(classnum):
        print(i)
        count=0
        #10000回試してみる
        for j in range(n):
            birthdays=[]
            for k in range(i):
                num=random.randint(0,365)
                birthdays.append(firstdate.date()+datetime.timedelta(days=num))
            #コレクション型で重複を無くす
            c=collections.Counter(birthdays)
            #i人ではなかった場合、重複があるのでカウントする
            if len(c)!=i:
                count+=1
        output.append(count/n)
    print(output)

    fig=plt.figure()
    plt.bar([i for i in range(classnum)],output)
    fig.savefig("output.png")
結果

結果のグラフを表します。
棒グラフじゃなくて折れ線グラフで良かった。。。
f:id:takabsk55:20210713005333p:plain
きれいな曲線になっていますね。
大体23人くらいのところで確率が0.5(50%)になってそうです。
50人を超えるとほぼ100%になりますね。
ちなみに完全な100%になるのは鳩の巣原理より367人です。

日向坂46に同じ誕生日の人はいるのか

最近ハマってる日向坂に同じ誕生日があるのか見てみます。
(ここからはIT関係なくただの趣味です笑)
ちなみに、日向坂の人数は22人です。
同じ誕生日がいるか微妙なところ!
公式サイトに誕生日があるので調べてみます。
メンバー | 日向坂46公式サイト
誕生日順でソートしてみると・・・

f:id:takabsk55:20210713010934p:plain

いました!!
森本茉莉と山口陽世が同じ誕生日ですね!!
まさかの新三期の二人が同じ誕生日。笑
まぁ何がともあれ確率が確認できたので良かったです。

まとめ

日向坂を題材にしましたが、誕生日のパラドックスが確認できましたね。
数式で確認できているのですが、実際にコードを動かして確かめるのも楽しいです。
ありがとうございました。