見出し画像

東海オンエアの『1/1024』と『1/2を10回連続(1/1024)』ってどっちの方が確率高いの!?を大真面目にPythonで分析した

こんにちは。

みなさんYouTubeはご覧になられますでしょうか。
僕はほぼ毎日見るんですが、その中でも特にずっと好きなのが東海オンエア。
かれこれ6年以上毎日見ております。

東海オンエアについては今更説明するまでもないと思うのですが、先日彼らが興味深い動画を投稿しました。
それが、掲題にある『1/1024』と『1/2を10回連続(1/1024)』ってどっちの方が確率高いの!?という動画です。

曰く、「感覚的に1/2を10連続で出す方が絶対に簡単。1/1024と同等の確率なんて信じられない!」とのこと。

僕は東大出身のゴリゴリの理系で、何なら専門は統計学だったわけですが、ちょっと気持ちは分からんでもないんですよね。
そこで今回は、この検証をPythonで誰でも実行できるツールを作ってしまいました。

こちらのgithubリポジトリから使用可能です。

外部モジュールは不使用で、取りあえずPythonを実行可能な環境であれば大丈夫です。


検証方法

非常に単純です。
文系の方は、0か1を選択。選択した数字が10回連続で出ればクリア
理系の方は、1から1024のうち好きな数字を選択、選択した数字が1回でも出ればクリアとなっています。

検証に関連する主なコードは以下の通りです

# 文系チーム
bunkei = int(input("文系チームの検証です。0か1か好きな値を入力してください"))
finish_bunkei = 0
count_bunkei = 1
while finish_bunkei < 10:
    x = random.randint(0, 1)
    if x == bunkei:
        finish_bunkei += 1
    else:
        finish_bunkei = 0
        count_bunkei += 1

print('文系チームの検証が終了しました。今回の記録は {} 回でした'.format(count_bunkei))

# 理系チーム
rikei = int(input("理系チームの検証です。1~1024の間の整数で好きな数字を入力してください"))
x = 1025
count_rikei = 0
while (x != rikei):
    x = random.randint(1, 1024)
    count_rikei += 1


取り敢えず戦わせてみたい方:main.py

まずは1回ちょいと戦わせてみたい方はmain.pyを実行してみてください。
実行させるとこのような画面になります。

git clone https://github.com/yoshio-yzoe/tokaionair_profitability.git

\tokaionair_profitability>python main.py
途中結果を表示する場合はyesを、表示しない場合はNoを入力してください

途中経過を表示する場合は、以下のように途中でどのような数字が出て何回チャレンジをしているのかがすべて表示されます。

\tokaionair_profitability>python main.py
途中結果を表示する場合はyesを、表示しない場合はNoを入力してくださいy
文系チームの検証です。0か1か好きな値を入力してください0

~~~
1098回目の
0回目 :
1
1099回目の
0回目 :
1
1100回目の
1回目 :
0
1100回目の
2回目 :
0
1100回目の
3回目 :
0
1100回目の
4回目 :
0
1100回目の
4回目 :
1
1101回目の
1回目 :
0
1101回目の
2回目 :
0
1101回目の
3回目 :
0
1101回目の
4回目 :
0
1101回目の
5回目 :
0
1101回目の
6回目 :
0
1101回目の
7回目 :
0
1101回目の
8回目 :
0
1101回目の
9回目 :
0
1101回目の
10回目 :
0
文系チームの検証が終了しました。今回の記録は 1101 回でした
理系チームの検証です。1~1024の間の整数で好きな数字を入力してください1
~~~
72 : 524回目
401 : 525回目
605 : 526回目
484 : 527回目
856 : 528回目
21 : 529回目
791 : 530回目
966 : 531回目
1 : 532回目
理系チームの検証が終了しました。今回の記録は 532 回でした
今回は文系チームが1101回、理系チームが532回で、理系チームの勝利です!

途中経過を表示しない場合は、それぞれの試行回数と勝敗だけが表示されます。

\tokaionair_profitability>python main.py
途中結果を表示する場合はyesを、表示しない場合はNoを入力してくださいn
文系チームの検証です。0か1か好きな値を入力してください1
文系チームの検証が終了しました。今回の記録は 2002 回でした
理系チームの検証です。1~1024の間の整数で好きな数字を入力してください1
理系チームの検証が終了しました。今回の記録は 1422 回でした
今回は文系チームが2002回、理系チームが1422回で、理系チームの勝利です!

今回はどっちでも理系チームの方が試行が少なくなっていますね(笑)


理系と文系に地獄を見てほしい方:repeat.py

もちろん、感覚的には1/2を10回のほうが少なくても、数学的には試行回数を重ねれば同じぐらいに落ち着くはずです。所謂大数の法則ですね。

なので、超野暮ですが、てつやの主張を数学的に立証するには、とにかくこのバトルを何度もしてもらうしかないんです。
そんなドSなあなたは、是非こちらのrepeat.pyを実行してみてください。

メイン部分のコードは以下の通りです

if __name__ == '__main__':

    bunkei_result = 0
    rikei_result = 0
    draw = 0

    N = int(input("文系と理系を戦わせる回数を整数で入力してください"))

    for i in range(N):
        # 文系チーム
        bunkei = 0
        finish_bunkei = 0
        count_bunkei = 1
        while finish_bunkei < 10:
            x = random.randint(0, 1)
            if x == bunkei:
                finish_bunkei += 1
            else:
                finish_bunkei = 0
                count_bunkei += 1

        # 理系チーム
        rikei = 1
        x = 1025
        count_rikei = 0
        while (x != rikei):
            x = random.randint(1, 1024)
            count_rikei += 1
        if (count_bunkei < count_rikei):
            bunkei_result += 1
        elif (count_bunkei > count_rikei):
            rikei_result += 1
        else:
            draw += 1

    if (bunkei_result > rikei_result):
        result = "文系の勝利です!"
    elif (bunkei_result < rikei_result):
        result = "理系の勝利です!"
    else:
        result = "引き分けです!"
    print('今回は文系チームが{}回勝利、理系チームが{}回勝利、引き分けが{}回で、{}'.format(bunkei_result, rikei_result, draw, result))

こちらのファイルでは、入力が必要なのは文理のバトルの回数のみ。何回でも好きなだけ戦わせることができます
なお、回数が膨大なので途中経過は見れない仕様になっていますのでご了承ください。

\tokaionair_profitability>python repeat.py
文系と理系を戦わせる回数を整数で入力してください10
今回は文系チームが7回勝利、理系チームが3回勝利、引き分けが0回で、文系の勝利です!

\tokaionair_profitability>python repeat.py
文系と理系を戦わせる回数を整数で入力してください100
今回は文系チームが48回勝利、理系チームが52回勝利、引き分けが0回で、理系の勝利です!

\tokaionair_profitability>python repeat.py
文系と理系を戦わせる回数を整数で入力してください1000
今回は文系チームが485回勝利、理系チームが515回勝利、引き分けが0回で、理系の勝利です!

\tokaionair_profitability>python repeat.py
文系と理系を戦わせる回数を整数で入力してください10000
今回は文系チームが4989回勝利、理系チームが5006回勝利、引き分けが5回で、理系の勝利です!

一旦、二陣営には10回、100回、1000回、10000回勝負していただきました。結果は10回では文系の勝ち、100回、1000回、10000回では理系の勝ちでした。なんかやけに偏ったなあ…

動画だと1バトルにつき2時間ぐらいかかっていたと思うので、10000回勝負だと20000時間=833日=2.28年分ぐらいの検証ということになりますね。
いつか東海オンエアが2.28年分のチャレンジをしてくれると僕は信じています。

ただ、やはり本質的にはかなりいい勝負であるのが見て取れますね。10000回もバトルしといて勝ち数の差が17しかありません。

興味深いのは10000回バトルの時に5回引き分けがあることです。動画でこれが出ていたらすごかった…!
引き分けが最も確率が同じであることを実感しやすいでしょうから、それが10000回中5回しかないのは感覚的に違う確率では?と思ってしまうのは仕方がないかもしれません。


※ヘッダー画像は公式宣材写真より引用させていただきました。
※当該コードは利用フリーです。noteのリンクを貼っていただけると嬉しいです。


いただいたサポートは、大学院の研究生活に必要な経費に充てさせていただきます。