ルーレットをやるなら赤/黒ベットよりダズンベットを選ぶべき数学的理由
ヨーロピアンルーレットの還元率は97.3%です。
【ルーレットの還元率】理論値通りになるかPythonで百万回シミュレーションしてみた
これはどんな賭け方をしても同じです。
しかし、100ドルを200ドルに増やそうとする場合、それが成功する確率は賭け方により異なってきます。
例えば赤/黒ベットとダズンベットで比較すると、ダズンベットの方が成功する確率は高くなります。
「嘘だろ?」
と思うかもしれませんが、それをマルコフ連鎖で計算する理論値と、百万回の繰り返しシミュレーションにより証明します。
赤/黒ベットとダズンベットの賭け方
始めに、それぞれの賭け方とオッズ(配当倍率)について整理しておきます。
ヨーロピアンルーレットには0から36までの数字がありますが、0は緑色、1から36までの数字は半分が赤色、もう半分は黒色になっています。
つまり緑色は1箇所、赤色は18箇所、黒色も18箇所あります。
このような中で、赤色に入るか黒色に入るかを賭けるのが赤/黒ベットです。
当たると賭金(ベット額)の2倍が配当としてもらえます。
賭金はもう使ってしまったと考えるので、差し引きで賭金と同額が利益として残ります。
これをオッズが2倍であると言います。
次にダズンベットとは数字を1~12、13~24、25~36の3つのグループに分け、どのグループに入るかを当てる賭け方です。
1ダースは12個ですね。
ダースは英語のダズン(dozen)が訛った言い方なので、ダズンベットと言います。
当たると賭金の3倍が配当としてもらえます。
賭金はもう使ってしまったと考えるので、差し引きで賭金の2倍が利益として残ります。
これをオッズが3倍であると言います。
マルコフ連鎖で計算する勝率の理論値
ここでは1枚20ドルのチップが5枚ある状態から10枚まで増やすケースを考えます。
つまり100ドルの元手を200ドルに増やすのが目的です。
この場合、チップの数がゼロ(破産)、もしくは10枚(目的達成)になったらゲームオーバーです。
別の言い方をすると、チップの数は0枚から10枚までの間の状態で変化し、0枚もしくは10枚の状態になったらゲームオーバーです。
これはマルコフ連鎖の中でも特に吸収マルコフ連鎖と呼ばれ、行列を使って各状態から各状態に遷移する確率を求めることができます。
赤/黒ベット
これを使って赤/黒ベットの勝率の理論値を求めるやり方については、下記の記事で解説していますので参照してみて下さい。
【ルーレットの赤黒ベット】100ドルの軍資金を200ドルに増やせる確率は?
この記事ではアメリカンルーレットの場合で計算していますが、ヨーロピアンルーレットだと各状態から各状態への遷移確率は次のような結果になります。
チップが5枚で始めて10枚まで増やせる確率、つまり100ドルの元手を200ドルまで増やせる確率は43.3%です。
ダズンベット
赤/黒ベットでは当たればチップが1枚増え、外れたら1枚減りましたが、ダズンベットでは当たれば2枚増え、外れたら1枚減ります。
当たる確率は32.4%(12/37)で、外れる確率は67.6%(25/37)です。
ですので5枚のチップでゲームを始めた場合、当たれば7枚に増え、外れたら4枚に減ります。
これを状態遷移図ですべての状態遷移について表すと次のようになります。
そして、これを遷移確率行列にすると次のようになります。
この行列を上記に示したように4つの部分行列に分解して
X=(Ⅰ-Q)-1R
を計算すると、
となります。
この行列の(i,j)成分が状態iから状態jへの遷移確率になるので、チップ枚数の遷移確率は次のようになります。
これによると、チップ5枚(100ドル)から10枚(200ドル)まで増やせる確率は44.8%ということになります。
つまりダズンベットの方が赤/黒ベットよりも1.5ポイントだけ勝率が高いということになりますね。
Pythonシミュレーション
それではこの理論値が正しいかどうかを、シミュレーションを100万回繰り返すことによって確認してみます。
Pythonコード
こちらはダズンベットを100万回繰り返して勝率の平均を求めるコードです。
赤/黒ベットも同じ考え方です。
import pandas as pd
import random
def play(onhand, ini_bet, target):
bet = ini_bet
onhand_log = []
while onhand > 0 and onhand < target: #手持ち資金がゼロまたは目標金額にになるまで繰り返し
choice = random.choices(p_options, k = 1, weights = p_weights) #確率ウェイトに基づくプレーヤーの選択
if bet > onhand: #ベット額が手持ち資金より足りない場合
bet = onhand #手持ち資金をベット額に設定
outcome = random.choices(options, k = 1, weights = weights) #確率ウェイトに基づきルーレットの結果を生成
if outcome == choice: #当りの場合
onhand += bet * 2 #手持ち金を増やす
bet = ini_bet #ベット額を初期値に戻す
else: #外れの場合
onhand -= bet #手持ち金を減らす
onhand_log.append(onhand)
return onhand_log
ini_onhand = 100 #初期資金
ini_bet = 20 #単位ベット額
ini_target = 200 #目標金額
options = ['A', 'B', 'C', 'Z'] #ルーレット結果のオプション
weights = [12, 12, 12, 1] #ルーレットオプションの確率ウェイト
p_options = ['A', 'B', 'C'] #プレーヤーの選択肢
p_weights = [1, 1, 1] #プレーヤーの確率ウェイト
results = pd.DataFrame()
for i in range(1000000):
logs = play(ini_onhand, ini_bet, ini_target) #1ゲーム当りの手持ち金推移を取得
final_amount = logs[-1]
game_length = len(logs)
result = pd.DataFrame([final_amount, game_length]).T
results = pd.concat([results, result], axis = 0)
results.columns = ['最終金額', 'ゲーム数']
win_rate = results[results['最終金額']!=0].iloc[:,0].count()/results.shape[0]
a = results['ゲーム数'].mean()
win_rate, a
シミュレーション結果
まずは赤/黒ベットのシミュレーション結果です。
(0.43297, 24.81804)
理論値の43.3%と同じになりました。
次にダズンベットのシミュレーション結果です。
(0.447989, 13.464621)
こちらも理論値である44.8%と一致しました。
ダズンベットの方が勝率が高いのです。
更に勝率を上げる賭け方
最後にダズンベットで更に勝率を上げる賭け方を紹介します。
それは2箇所に賭けることです。
ダズンベットは1から36までの数字を12個ずつの3グループに分けて、そのうちの1つのグループに賭けるやり方なので、当たる確率は約1/3です。
これを2つにグループにまとめて賭けると、当たる確率は当然のことながら約2/3に上がります。
しかし、2つのグループに賭けても当たるのはどちらかなので、当たった場合の利益は半分になります。
一方で外れる確率は約1/3と小さいのですが、外れたら2箇所に賭けているので2倍損します。
つまり、
1箇所に賭けるダズンベット・・・当たると利益2(確率1/3)、外れると損1(確率2/3)
2箇所に賭けるダズンベット・・・当たると利益1(確率2/3)、外れると損2(確率1/3)
です。
「どちらも100ドルから200ドルにする確率は同じでしょ?」
と思いますが、実は2箇所に賭ける方が0.02ポイントほど勝率が上がります。
「なんだそんなの誤差範囲だよ」
と思うところですが、180ドルから200ドルにできる確率は4ポイントも勝率が上昇します。
マルコフ連鎖で計算した理論値は次のようになります。
ダズンベットの1箇所賭けの勝率と赤/黒ベットの勝率との差も示しましたが、ほとんどのケースでダズンベット2箇所賭けの勝率の方が高くなっています。
これは百万回繰り返すシミュレーションでも同じ結果になります。
オッズが2倍の赤/黒ベットやオッド/イーブンベットではなく、オッズが3倍のダズンベットやカラムベットを選び、しかも2箇所に同時に賭けるようにした方が勝率が上がるのです。
98.48%勝てる必勝法もある!?
更に、この2箇所賭けの勝率を大幅に上げる必勝法も存在します。
その名は98.48%法です。
なんと98.48%の確率で勝てる必勝法と言われています!
でも残念ながらこの必勝法はデタラメです。
騙されないようにこちらも読んでみて下さい。
【98.48%法の嘘をあばく】Pythonで百万回シミュレーションしてみた結果を公開