17世紀、フランスの貴族シュバリエ・ド・メレ卿(アントワーヌ・ゴンボー)という人はギャンブル好きだった。
彼は、サイコロのギャンブルが好きで、
1つのサイコロを4回投げて、6が出れば勝ちというゲームをした時は2/3の確率で勝つと考えた。
勝率は予想に届かなったが、勝ち越すことは出来た。
そして、2つのサイコロを24回投げて、6,6のゾロ目が出れば勝ちというダブルシックスも同じように、6,6のゾロ目が出る確率は1/36なのだから24回投げれば2/3で勝てるはずと考えた。
しかし、実際は予想に反してあまり勝てなかった。
そこで、ゴンボーは数学者パスカルに、何がおかしいか相談してみた。
パスカルはゴンボーの考え違いを見抜き、出る目から計算するのでなく、出ない目から計算するのが正しいと答えたそう。
さてそれをPythonで検証してみましょう。
まずは1つのサイコロから6の目が出れば勝つというゲーム
4回投げてどれくらいの確率で勝つかrandomを使って試してみましょう。
- #! /usr/bin/env python
- # -*- coding: utf-8 -*-
- import random
- print("[probability]")
- #試行回数
- trial = 10000
- #投げる回数
- roll = 4
- #勝った回数
- win = 0
- def dice(trial, roll):
- win = 0
- reset = False
- for i in range(trial):
- reset = False
- for j in range(roll):
- if reset == False:
- #サイの目をランダムに出す
- pip = random.randrange(1, 7)
- #目が6なら勝ち
- if pip == 6:
- win += 1
- reset = True
- return win
- win = dice(trial, roll)
- print("試行回数: ", trial)
- print("勝った回数: ", win)
- print("勝率: ", (win / trial))
結果:
[probability]
試行回数: 10000
勝った回数: 5218
勝率: 0.5218
[probability]
試行回数: 10000
勝った回数: 5184
勝率: 0.5184
[probability]
試行回数: 10000
勝った回数: 5140
勝率: 0.514
[probability]
試行回数: 10000
勝った回数: 5144
勝率: 0.5144
[probability]
試行回数: 10000
勝った回数: 5222
勝率: 0.5222
2/3には届きませんが勝ち越すことは出来ます。
次に、2つのサイコロを24回投げ、6,6のゾロ目が出たら勝ちというゲーム
- #! /usr/bin/env python
- # -*- coding: utf-8 -*-
- import random
- print("[probability]")
- #試行回数
- trial = 10000
- #投げる回数
- roll = 24
- #勝った回数
- win = 0
- def dice(trial, roll):
- win = 0
- #ゲームリセットフラグ
- reset = False
- for i in range(trial):
- reset = False
- for j in range(roll):
- if reset == False:
- #サイの目をランダムに出す
- pip1 = random.randrange(1, 7)
- pip2 = random.randrange(1, 7)
- #print("({}, {})".format(pip1, pip2), end=" ")
- #目が6, 6なら勝ち
- if pip1 == 6 & pip2 == 6:
- win += 1
- reset = True
- #print()
- return win
- win = dice(trial, roll)
- print("試行回数: ", trial)
- print("勝った回数: ", win)
- print("勝率: ", (win / trial))
結果:
試行回数: 10000
勝った回数: 4939
勝率: 0.4939
[probability]
試行回数: 10000
勝った回数: 4997
勝率: 0.4997
[probability]
試行回数: 10000
勝った回数: 4900
勝率: 0.49
[probability]
試行回数: 10000
勝った回数: 4957
勝率: 0.4957
[probability]
試行回数: 10000
勝った回数: 4961
勝率: 0.4961
パスカルの計算したとおりですね。
ポイントは勝った場合にゲームリセットすることです。
これが無いと一つのゲームに複数勝利することになりますので2/3に近い数字が出ます。
パスカルの計算式
1つのサイコロを4回投げて6が出たら勝つゲームの勝率
1 - (5/6) ^4 = 0.5177469
2つのサイコロを24回投げて6, 6のゾロ目が出たら勝つゲームの勝率
1 - (35/36) ^4 = 0.491403876
実際にランダムに試行した結果も計算に近い数字が出ましたね。