見出し画像

誕生日が密集している確率をシミュレーションしてみた!【Python】

先日22歳の誕生日を迎えました!
祝ってくれた方々、ありがとうございました!

ところで…
私が所属しているバドミントンサークルには32名のメンバーいるのですが、その32人中7人の誕生日が2/11~2/16の6日間に密集しているのです!

なので、この6日間は色んな人と誕生日を祝われたり祝ったりと、とても楽しい1週間でした!

そこでふと、「32人中7人の誕生日が任意の6日間に密集している確率はどれくらいなのだろうか??」と疑問に思いました。
これを数学的に解決する力はなかったので、Pythonでシミュレーションしてみることにしました。

シミュレーションを行う前に軽く予想をしてみようと思います。
「32人中7人の誕生日が任意の6日間に密集している確率」だとややこしいので、「"32人中5人"の誕生日が"特定の"6日間に密集している確率」に置き換えてみました。"任意の"から"特定の"に変えれば、人数の制約は少しゆるくしても良いのかなと、何となく"32人中5人"にしてみました。何となくです。
その結果、ある1人の誕生日が特定の6日間にある確率を$${p=\frac{6}{365}}$$とすると、$${_{32}C_5 \cdot p^5}$$を計算して、およそ0.024%くらいの確率と計算出来ました!(結局、電卓に頼ることに…)

0.024%(4166回に1回くらい)って相当レアじゃないか??
といった感じですが、実際のシミュレーション結果ではどうなるのでしょうか。

シミュレーションに使ったPythonのソースコードは以下の通りです。
興味がない方はスキップして頂いて構いません!

import numpy as np

def simulate_birthdays(n_simulations=1000000):

    # 各種初期値
    n_people = 32
    days_in_year = 365
    target_range = 6
    target_birthdays = 7

    success_count = 0

    for i in range(n_simulations):
        # 32人の誕生日をランダムに生成
        birthdays = np.random.randint(0, days_in_year, n_people)

        # 任意の6日間に7人以上の誕生日が含まれているかを確認
        for day in range(days_in_year):
            # 6日間の範囲を設定(年末と年始をつなげる)
            range_end = (day + target_range) % days_in_year
            if range_end < day:  # 年末と年始を跨ぐ場合
                count = np.sum((birthdays >= day) | (birthdays < range_end))
            else:  # 通常の範囲
                count = np.sum((birthdays >= day) & (birthdays < range_end))

            # シミュレーションの進捗確認用
            if (i+1) % (n_simulations // 1000) == 0:
                progress = (i+1) / n_simulations * 100  # 進捗をパーセントで計算
                print(f'Progress: {progress:.1f}%')

            if count >= target_birthdays:
                success_count += 1
                break

    # 条件を満たす確率を計算
    probability = str(success_count * 100 / n_simulations) + "%"
    return probability

# シミュレーションを実行
print(simulate_birthdays())

各種初期値も与えてあるので、初期値を変えて遊んでみたい人はぜひ使ってください。100万回シミュレーションにしてあるので、50分くらい実行時間がかかりました…。このnoteを書きながら実行が終わるのを待ってます(Cで書けとか言わないでください)。

さて、実際のシミュレーション結果を発表します!

シミュレーション結果

0.0155%でした!!
100万回のシミュレーションを行って、たったの155回しか発生しない確率でした。まさか予想より更に下回るとは思いませんでした…

じゃんけんで例えると、2人のじゃんけんで8回連続であいこになる確率が0.0152%でほとんど同じ確率でした。
コインで例えると、コインが13回連続で表になる確率が0.0122%でした。
こう考えると超レアですね!

まさか身近なところに、こんな小さな確率が隠れているとは思わなかったので、とても面白かったです!

思い付きで書いた記事ですが、楽しんでいただけたでしょうか。
以上、ありがとうございました!


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?