【98.48%法の嘘をあばく】Pythonで百万回シミュレーションしてみた結果を公開

2024年5月18日

Photo by Jon Tyson on Unsplash

3回連続で112が出た。次も112が出る確率は1.52%しかない。だから1336に賭ければ98.48%の確率で当たるはず

というのが98.48%の考え方です。

 

この手法はルーレットで驚異の必勝法として有名で、ネットで検索すれば沢山の記事がヒットします。

これは

10回連続で赤が続いたから、次は絶対に黒が来るはず!

という考え方と同じです。

 

なるほど、もっともな気もしますが、そんなに簡単に勝てるのでしょうか?

もしこれが本当なら、そのチャンスが来るまでじっくり待てば誰でも9割以上の確率で勝ててしまいます。

皆がそうすればカジノは大損です。

なんか胡散臭い必勝法であることは皆さんお気づきでしょうが、心のどこかで

とはいえ少しは勝率が上がるのでは。。。

という淡い期待も抱くのではないでしょうか。

 

そこでPythonを使って百万回の賭けを行ってみました。

98.48%法どころか、99.999%でも「効果ゼロ」であることがわかります。

また最終章では、この98.48%法がなぜまやかしであるのかを確率論の観点から明らかにします。

 

◆仕事や勉強の息抜きに。。。

98.48%法の考え方

この手法はダズンベットやコラムベットのようなオッズが3倍の賭け方に使われます。

(本当は赤/黒ベットのようなオッズが2倍の賭けにも使えるのですが)

ダズンベットオッズについては下記の記事を参照下さい。

ルーレットをやるなら赤/黒ベットよりダズンベットを選ぶべき数学的理由

 

ダズンベットではプレーヤーは11213242536のいずれかに賭けます。

それらを順にAゾーン、Bゾーン、Cゾーンと呼ぶことにします。

この時、BゾーンにもCゾーンにも3回連続で玉が入らなかったら、4回続くことはないだろうと考えてBゾーンとCゾーンの両方に賭けます。

そうすれば、どちらかは当たるでしょという考え方です。

 

それではBゾーンにもCゾーンにも4回連続で玉が入らない確率は何%でしょうか?

次のように計算できます。

 

BゾーンにもCゾーンにも玉が入らないということはAゾーンまたはゼロに入るということなので、そうなる確率は

13÷3735.14%

です。

なのでそれが4回連続する確率は

(13÷37)^4=1.52%

になります。

従って3回連続でBゾーンにもCゾーンにも入らなければ、次もそうなる確率は1.52%しかないので、BゾーンとCゾーンの両方に賭けておけば、どちらかは

100%1.52%98.48%

の確率で当たるでしょうというのが98.48%法の考え方です。

 

納得ですか?

実はこの考え方には単純な過ちがあります。

それについては最終章で解説しています。

 

99.999%法とは?

この手法を発展させると99.999%というスーパーウルトラ必勝法も編み出すことができます。

98.48%法は2つのゾーンに3回連続で入らなければ、4回目にその2つに賭ける手法でしたが、10回連続で入らなければ11回目にそこに賭ければ99.999%で当たることになります。

 

ほぼ100%当たる、外れるわけがない!という魔法のような手法ですが、もちろんそんなことはありません。

これについても百万回賭けるシミュレーションをしています。

結果は次の章の通りです。

 

シミュレーション結果

1箇所に賭ける賭金を20ドルとし、100ドルの元手を200ドルまで増やすゲームを百万回行うシミュレーションを行いました。

98.48%

99.999%

2つについて行いました。

 

Pythonコード

98.48%法のシミュレーションコードです。

99.999%法についても「同じゾーンに玉が連続して入るまで待つ回数(wait_set)」の設定値を3から10に変えるだけで、同じようにシミュレーションできます。

import pandas as pd
import random

def play(onhand, ini_bet, target):
    bet = ini_bet
    onhand_log = pd.DataFrame()
    wait_cnt = 0
    outcome = ''
    outcome_prev = ''
    while onhand > 0 and onhand < target: #手持ち資金がゼロまたは目標金額にになるまで繰り返し
        if bet > onhand: #ベット額が手持ち資金より足りない場合
            bet = onhand #手持ち資金をベット額に設定
        _outcome = random.randint(0, 36) #0から36の整数の乱数を生成
        if _outcome in list(range(1,13)): #1から12はAゾーン
            outcome = 'A'
        elif _outcome in list(range(13,25)): #13から24はBゾーン
            outcome = 'B'
        elif _outcome in list(range(25,37)): #25から36はCゾーン
            outcome = 'C'
        else:
            outcome ='Z' #0はZ
        if outcome[0] == 'Z': #0が出たら
            if wait_cnt == wait_set:
                onhand -= bet * 2 #手持ち金を減らす
                data = pd.DataFrame([onhand, 99]).T
                onhand_log = pd.concat([onhand_log, data], axis = 0)
        elif outcome == outcome_prev: #前のゾーンと同じゾーンに入ったら
            wait_cnt += 1
            if wait_cnt == wait_set + 1: #4回目も同じゾーンに入ったら
                onhand -= bet * 2 #手持ち金を減らす
                data = pd.DataFrame([onhand, wait_cnt]).T
                onhand_log = pd.concat([onhand_log, data], axis = 0)
                wait_cnt = 0
        else: #前のゾーンと異なるゾーンに入ったら
            if wait_cnt == wait_set: #4回目は異なるゾーンに入ったら
                onhand += bet #手持ち金を増やす
                data = pd.DataFrame([onhand, wait_cnt]).T
                onhand_log = pd.concat([onhand_log, data], axis = 0)
            outcome_prev = outcome
            wait_cnt = 0
    return onhand_log

ini_onhand = 100 #初期資金
ini_bet = 20 #単位ベット額
ini_target = 200 #目標金額
options = ['A', 'B', 'C', 'Z'] #ルーレット結果のオプション
weights = [12, 12, 12, 1] #ルーレットオプションの確率ウェイト
wait_set = 3

results = pd.DataFrame()
for i in range(1000000):
    logs = play(ini_onhand, ini_bet, ini_target) #1エピソード当りの手持ち金推移を取得
    final_amount = logs.iloc[-1, 0] #最終金額を取得
    game_length = len(logs) #目標達成または破産までのゲーム数を取得
    rate = sum(logs[1]==wait_set)/len(logs) #98.48%法の成功率(1ゲームごと)
    result = pd.DataFrame([final_amount, game_length, rate]).T
    results = pd.concat([results, result], axis = 0)

results.columns = ['最終金額', 'ゲーム数', '確率']
win_rate = results[results['最終金額']>0].iloc[:,0].count()/results.shape[0] #最終金額に達した成功率
a = results['ゲーム数'].mean() #1エピソード当りのゲーム数の平均
b = results['確率'].mean() #98.48%法の成功率(1ゲームごと)
win_rate, a, b #百万回の賭け(エピソード)の平均勝率、エピソード当りのの平均ゲーム数、4回目に異なるゾーンに入った率(98.48%法の成功率)を出力

 

98.48%法の嘘

結果はこのようになりました。

(0.448422, 13.301421, 0.6167013041472197)

 

100ドルを200ドルまで増やせた勝率は44.8%でした。

この勝率は98.48%法を使わずに、適当にベットした場合の勝率と同じです。

マルコフ連鎖を使って計算した理論値については、下記の記事で解説していますが、この理論値と同じです。

ルーレットをやるなら赤/黒ベットよりダズンベットを選ぶべき数学的理由

 

つまり98.48%の効果はゼロでした。

 

個々でも見てみましょう。

百万回のうちの最初と最後の5回の結果は下記の通りです。

 

1回目や2回目は200ドルまで増やすことに成功していて、3回目や5回目は失敗していることがわかります。

また1回目は3回連続で同じゾーンの数字が出た時に、4回目には違うゾーンに入った率が87.5%だったことを示しています。

割合と高い確率で、4回同じゾーンに入らないという賭けがある程度成功したことがわかります。(でも98.48%ほどは高くない)

ところが3回目はその確率が42.9%しかありません。

そして百万回シミュレーションした平均は61.6%でした。

 

3つのゾーンのうち2箇所に賭けているので、適当に賭けても65%くらいは当たるはずです。

それが61.6%だったということは、3回連続で同じゾーンに入るまで待ったことが全く無駄で効果がなかったことを示しています。

 

99.999%法の嘘

次に99.999%法を百万回行いました。

10回連続で同じゾーンに玉が入るまで待つため、シミュレーションが終わるまで7時間もかかりましたが、結果は次の通りです。

(0.448201, 13.3375, 0.6158023042848955)

 

このように勝率は44.8%、適当に賭けた場合の理論値と全く同じでした。

同じゾーンに10回連続で玉が入るのを辛抱強く待っても、11回目にも同じゾーンに玉が入る確率は相変わらず1/3くらいで変わらなかったということです。

 

この理論のどこが間違っているのか?

このように98.48%法は全く効果がありません

また、それを発展させた99.999%法ですら完全に効果ゼロです。

 

ではこの理論のどこが間違っていたのでしょうか?

よく言われるのは、ルーレットは独立事象のゲームであるということです。

独立事象とは今回赤に玉が入っても、次に赤に玉が入る確率は1/2で変わらないということです。

たまたま10回連続で赤に入ったとしても、11回目も1/2の確率で赤が出るということです。

 

そんなのわかってるけど、平均的には赤と黒が半々出るはずだから、10回連続で赤が出たなら次からは黒が出やすくなるんじゃないの?

とも思いますが、赤と黒が半々になるというのはもっと長期に渡っての話なので、たかが20回や30回では偏りが出ても不思議ではないのです。

 

でも4回連続でBゾーンにもCゾーンにも入らない確率が1.52%しかないことは厳然たる事実。だから3回連続入らなければ、4回目にそうならない方に賭ければ98.48%で当たるのでは?

とも思いますね?

 

でもこの考え方には単純な誤りがあります。

確かに4回連続で2つのゾーンに入らない確率は1.52%なのですが、それは3回連続で2つのゾーンに入らない確率が4.34%で、次も同じゾーンに入らない確率が35.14%であることの帰結です。

つまり

4.34%35.14%1.52%

なので、3回連続2つのゾーンに入らなかったことを確認したあなたにとっては(4.34%しか起こり得ない珍しい出来事を今しがた目撃したあなたにとっては)、次も同じゾーンに入らない確率はいつもと変わらぬ35.14%なのです

 

この98.48%法を知って、これなら勝てそうだと思って試してみようと思っていたあなた。

98.48%勝てると思ってやってみたけど、60%くらいしか勝てないなあ、おかしいなあと思っていたあなた。

そんなあなたが本記事を読んで「98.48%法はまやかしである」と確信を持っていただけたなら、管理人は本記事を書いて本当に良かったなあと思えます。

 

他にこんなイカサマ必勝法もあります。

【3/2ベット法の嘘をあばく】ルーレットをPythonで百万回してみた結果を公開