1. 程式人生 > 其它 >號稱「永遠不會輸錢」的馬丁格爾策略

號稱「永遠不會輸錢」的馬丁格爾策略

點進來,說明你想贏,那我們直入主題。


所謂「馬丁格爾(Martingale)策略」是在某個賭盤裡,當每次「輸錢」時就以 2 的倍數再增加賭金,直到贏錢為止。

假設在一個公平賭大小的賭盤,開大與開小都是 50% 的概率,所以在任何一個時間點上,我們贏一次的概率是 50%,連贏兩次的概率是 25%,連贏三次的概率 12.5%,連贏四次的概率 6.25%,以此類推。因此,以概率來算,如果連贏四次的概率 6.25%,也就是說連輸四次的概率一樣也只有6.25%。

假設我們有 63 元,按照馬丁格爾策略理論來算的話,63 元的連續虧損如下:

所以只能容許「連續虧損」6 次,概率是:

假如我們玩「押大小」,當我們與莊家對賭 73 次,在某個點「連續虧損 6 次」的概率是 41.7%,演算法為(證明可以跳過不看,不影響閱讀):

同理:

  • 當我們押大小 150 次當中有一次會超過「連續虧損 6 次」的概率是 69.2%
  • 當我們押大小 250 次當中有一次會超過「連續虧損 6 次」的概率是 85.9%

所以馬丁格爾策略風險相當高,別別別,客官先別走,其實今天介紹的不是馬丁格爾策略,而是「反馬丁格爾策略(Anti-Martingale)」。


「反馬丁格爾(Anti-Martingale)策略」,是在某個賭盤裡,當每次賭金「贏錢」時就以 2 的倍數再增加賭金,若一直贏,就再加倍賭注。(直到某個目標次數,再重新開始)

再假設我們有 63 元,第一次我們都從 1 元開始押注,我們選擇使用「反馬丁格爾策略」,每贏一次賭注都以 2 的倍數遞增。也就是 1,2,4,8,16,32 一直遞增的方式來押注。因此,當我們連押四次都輸錢的概率是 6.25%(前面算過),我們會輸掉 4 元。同樣,同樣的概率下,連贏四次,那我們將會贏得:

所以在「同一個概率點」上,我們會「輸掉 4 元」或「贏得 15 元」,我們看看其他概率點;

  • 連贏三次或虧三次的概率是 12.5%,你會「輸掉 3 元」或「贏得 7 元」
  • 連贏兩次或虧兩次的概率是 25%,你會「輸掉 2 元」或「贏得 3 元」

是不是有點迷糊,我們一步一步看:

假如目標是連贏四次才會從頭押注(我們稱為一輪),沒到達連贏目標之前輸都算失敗,第一次都從 1 元開始(達到目標前輸掉都會重新從 1 元開始押注)。只贏一次、兩次、三次後輸掉的情況如下:

可以看出:

不管設定贏得目標次數是幾,每次失敗,都是虧損「第一次押注的金額」

繼續以 63 元賭金為例,以「反馬丁格爾策略」的操作方法來操作,你要輸光,就必須讓莊家連開 63 次與你押注相反的盤,這種情況一百萬兆次才會發生一次 ?

有點懵逼?沒關係,我們再通過感性認識去理解一下


想象一下,我們站在一座山丘上,堆了四個雪球(1 元開始押注),我們同一時間將雪球往下推,假設其中三個雪球都在途中被石頭啦、樹木啦撞壞了(此輪失敗),只有一個順利滾到山下(達成目標連贏),那麼它現在已經變得非常的大,可能是當初雪球大小的十倍或百倍大小(獲利)

滾雪球~

有沒有好理解一些?

傳統的「馬丁格爾」以及「反馬丁格爾」策略都是以

為乘積,但是實際上

的遞增操作方式還是風險挺大的,我們可以使

之間,當然在賭場算起來就不方便了 ?

總結一下,這個策略有兩點比較關鍵:

  1. 趨勢
  2. 趨勢的長度

分別對應

  1. 達成目標(連贏)的概率
  2. 連贏次數的設定

看到這裡是不是有點蠢蠢欲動?筆者也是,所以我用 Python 寫了個小程式

定義一個賭局

引數

  1. pocket:開始玩時兜裡裡的錢
  2. pay:單次賭注

返回:

  1. result:1(贏)或者 0(輸)
  2. pocket:玩完一把後兜裡的錢
import random
WIN  = 1
LOSE = 0

def gambling_50_percent(pocket, pay):
    result = random.randint(0, 1)
    if result == WIN:
        pocket += pay
    else:
        pocket -= pay
    return result, pocket

註解:贏了會贏押注相同的錢,輸了賭注被莊家收走

定義一輪遊戲

引數解釋:

  1. win_time_to_stop:目標連贏次數
  2. pocket:錢包裡面的錢
  3. pay:單次賭注
  4. n:押注遞增係數
def play_a_round(win_time_to_stop, pocket, pay, n):
    money_when_start = pocket
    root_pay = pay

    for i in xrange(win_time_to_stop):
        win_or_lose, pocket = gambling_50_percent(pocket, pay)
        if win_or_lose == WIN:
            pay *= n
        else:
            pay = root_pay
            break
    print pocket, pay
    return pocket - money_when_start, pocket > money_when_start

註解:此方法是模擬一輪(win_time_to_stop 次)遊戲,只有兩種結果,即:

  1. 達到「目標連贏次數」
  2. 未達到「目標連贏次數」

迴圈中,如果輸一次,那麼直接跳出迴圈,結束此輪;沒輸就繼續玩直到「目標連贏次數」,最終返回金額變動(pocket - money_when_start)和輸贏結果(pocket > money_when_start

玩幾把

兜裡:63 元

首次賭注:1 元

押注遞增係數:2 倍

目標連贏次數:4 次

連輸 10 輪

根據我們前文的分析,每輸一輪,只會虧損「第一次押注的金額」

十個雪球全部滾失敗,損失:

元(這種情況比較常見 ?)

一個雪球滾成功啦

一個雪球滾成功,獲利:

九個雪球滾失敗,損失:

最終結果:

,符合計算結果

兩個雪球,不可思議!

兩個雪球滾成功,獲利:

八個雪球滾失敗,損失:

最終結果:

,符合計算結果

完整原始碼:

https://gist.github.com/tmpbook/957a41aee344789a67a7e8201c4ae617