標籤:

電影 《決勝21點》裡面的演算法是怎麼弄的?


由沃·茲基·邊德研究所最新的研究報告表明, 21 點在提升玩家智力水平的同時,更有助於提升玩家的顏值。所以即日起,我們向廣大用戶提供 21 點顏值大禮包。

禮包一:

禮包二:

禮包三:

這個經理為何如此面熟?快來這裡看看吧!

我們向您承諾:介絕對四里沒有挽過的船新版本,擠需體驗三番鍾,里造會幹我一樣,愛象節款遊戲。還等什麼?快來學習演算法領取大禮包吧!

21點玩法簡介

確定策略!

假設有無數副撲克牌用於遊戲。如此,就可以認為從牌堆中新獲取的牌與棄牌堆牌的點數無關。且莊家的策略是固定的:已有的點數和小於 17 點則拿牌,反之,大於等於 17 點則停牌。在這裡為簡化情況,我們只比較拿牌和停牌兩種策略,而不考慮分牌,保險,雙倍下注等策略。

莊家篇:

我們首先分析莊家的策略,假設遊戲開始時,莊家明牌的點數為 5

那麼莊家兩張牌的點數和為 15 的概率(即暗牌為 10、J、Q或K )是 frac{4}{13} 。同理,為可能的其他點數和(例如點數和為 8 ,即暗牌點數為 3 )的概率為 frac{1}{13}

以此類推,我們可以得到下面這張概率表:

有興趣的同學可以自行驗證最後一列,明牌為 A 的情況。這樣,結合一開始提出的莊家固定策略,我們還可以得到莊家已有點數和與最終點數和的關係。

狀態轉移矩陣

現在我們由莊家明牌的點數確定了莊家已有點數和的概率,進而確定了莊家最終點數和的概率。這個時候,將上述兩個矩陣轉置相乘,我們就可以得到莊家明牌的點數和最終點數和的關係了。

玩家篇:

以上是有關莊家的情況,下面我們來觀察一下玩家的策略。顯然的是,當玩家已有點數和小於 12 時,拿牌一定是最佳策略。而當已有點數等於 21 時,停牌一定是最佳策略。所以我們只考慮已有點數介於 1220 (含端點)的情況。同樣的,我們可以得到玩家要一張牌後,點數和對應的概率。

結合玩家的勝利條件:

1. 雙方都沒有爆牌的情況下,玩家最終點數和大於莊家。

2. 玩家沒有爆牌的情況下,莊家爆牌。

以及莊家篇最後得到的結論,列出玩家在不同情況下,選擇要一張牌的勝率表:

以及選擇不要牌的勝率表:

對比兩張勝率表,我們就能很容易的確定我們的策略了。

制定規則!

下面我們簡化規則,制定一個簡單的遊戲流程來測試一下我們的策略:

0 階段:無限牌堆加入遊戲。玩家策略加入遊戲。莊家固定策略加入遊戲。 判定莊家和玩家手牌是否為黑傑克,若兩方皆為黑傑克,則判定平局,該輪遊戲結束。若只有其中一方為黑傑克,則判定擁有黑傑克的一方獲勝,該輪遊戲結束。若雙方都沒有黑傑克,則進入第 1 階段。

1 階段:玩家加入遊戲。

遊戲開始時,先進入玩家階段,由玩家決定是否拿牌。若玩家在一次或多次拿牌後爆牌則判定莊家勝,該輪遊戲結束。若不然,玩家可以隨時停牌,此時記錄玩家當前點數和,進入第 2 階段。

2 階段:

玩家階段結束後,進入莊家階段。莊家採用固定策略,當前點數和小於 17 則拿牌,反之則停牌。同樣的,若莊家在一次或多次拿牌後爆牌則判定玩家勝,該輪遊戲結束。若不然,莊家直到當前點數和大於或等於 17 時停牌,此時記錄莊家當前點數和,進入第 3 階段。

3 階段:裁判加入遊戲。

判斷莊家和玩家最終點數和的大小關係,若玩家的最終點數和較大,則判定玩家獲勝,其他情況判定為莊家獲勝。該輪遊戲結束,進入下一輪遊戲。

測試階段!

我們模擬了 400 次策略實施的情況,並統計莊家和玩家的實時勝率,從第 50 次開始,我們用紅線表示莊家的實時勝率變化,藍線表示玩家的實時勝率變化,我們得到的絕大部分(造數君估計在 90 %以上)是下面兩種類型的圖:

  • 泯然眾圖型:

  • 輸少算贏型:

可以看到大部分的圖,紅線與藍線是沒有交點的,即玩家被莊家完全碾壓。當然由於我們只是從第 50 次開始計數,所以也有比較反常的現象:

  • 中期強勢型:

  • 後期疲軟型:

同時也出現了醫學上難以解釋的現象:

  • 迴光返照型:

以及它的變種:

  • 大起大落型:

以及變種的變種:

  • 起起落落落落落落落落落落落落型:

可以看到在無限牌堆,模擬次數足夠多的情況下,玩家都難逃被莊家壓制的情況。不論其間有多少次勝率上升的情況,最後都會落落落落落到低點。

也許這就是人生吧。

彩蛋!

有興趣的小夥伴可以私信造數君領取:模擬玩家策略在有限牌堆和無限牌堆的勝率變化代碼哦~


高低算牌法,在21點的遊戲當中,2-9代表本身,10-K代表10,A可以做1或11。

我們將2-6當做小牌,7-9當做中立牌不算,10-A當做大牌。

一般賭場會使用4副撲克以上,其中10點的概率為4/13約等於30.76%,當前面出現的小牌多過大牌,比如多了10張,我們假設牌盒中共有4副牌,莊家已經發過了一半的牌,那麼剩下的牌還有兩副共104張,2-6大約為35張,10-A大約為45張,那麼10點的概率為36/104約等於34.61%,你拿到20或者21點的概率會提高,你9,10,11點加倍時,拿到19,20,21的概率會提高,同樣莊家爆牌的概率也會提高,我們的盈利就隨之提高。

這是一個很簡單的演算法,當前面出現的小點越多的時候,我們的注碼可以相應的加大,《決勝21點》裡面的孩子就是用這個方法算牌的。


我看了電影后研究了兩三天,總算搞明白了。可以看我在類似題目下面的回答:

https://www.zhihu.com/question/21668097/answer/156334947


開始沒答是因為發現此題關注人很少,但有人催了就來答了,哪怕只有一個人看也得好好答!

------------手機排版的分割線-----------

這個電影是根據真實事件改變的,MIT算牌小組是存在的。電影裡面算牌團隊不是有個亞裔么,據說是真實團隊的組員之一。

他們使用的演算法並不是什麼秘密,現在已經路人皆知了,即高低法。高低法是一個簡稱,由美國UCLA大學的物理博士,MIT數學教授Thorp發明。Thorp雖是個概率nerd,卻對賭場遊戲有著偏執的熱愛,一直試圖利用自己的數學知識和技術開發出一套橫行賭場的演算法,或者說策略。

經過Thorp努力地研究,他終於開發出來了一套策略,而且他還從數學上證明了策略的成功!這篇論文叫做A Favorable Strategy for Twenty-One,發表在了美國科學院院報上。Thorp利用這個策略在賭場賺了很多錢,並且寫了一本書叫做Beat the Dealer。這本書在1962年出版後迅速登上了紐約時報暢銷書排行榜。因為號稱是數學天才破解了賭場秘訣!

這部電影裡面有一個鏡頭,是主角剛剛加入算牌團隊,很認真的練習,哪怕上課時間也不放過,在教科書下面壓了一本書在仔細研讀,背景旁白是"it is just simple math blablabla"。那本書就是著名的Beat the dealer。(手機沒法截圖,下次有電腦了再截圖)。

有了這本書的秘籍,很多善長數學腦子算地極快的人就天天去賭場算牌賺錢,包括電影里的學生們。

後來的故事脫離了21點,變成了金融,有空再來更吧,手機打字太辛苦。。。


前位已經說了大部分,我補充一些實戰經驗~

Ace:首先在21點這個遊戲中,Ace對玩家的優勢會非常高,因為玩家拿到BJ會有1.5倍的盈利而Dealer拿到BJ你只是正常輸掉,所以在一到兩副牌的賭局當中,有能力的玩家會計算Ace在未發牌堆里的數量,從而更好的控制自己下注量

穿透率:指的是最後被莊家切掉的牌占所有牌的比例,比如8副牌的遊戲,莊家切掉一副牌,穿透率就是1/8,由於越到最後,算牌精度越高,因此穿透率越低越好,通常一副半的切牌及以下,是我能接受的範圍

真數計算:即總的算牌正負值,除以牌堆中剩餘牌的副數,比如已經算到總數是+10,牌堆目測還剩兩副,則真數為+5,電影里只是演了總數的計算過程,而準確觀察牌堆剩餘量,並快速算出真數才是算牌的基本功

調整策略:在基本策略(網上百度即有)的基礎上,通過對真數的測算,有調整策略,最簡單的比如十六對dealer的face card,在真數大於0的時候,就不應該再叫牌了

下注量:根據真數的不同,下注比例應有所不同,但根據某個人的計算,實在忘了名字了。。最大的下注籌碼量不應超過總量的3%,這樣在面對Variance的時候,你的盈利性價比是最高的

Side bet:有一些賭場會有很好玩的side bet,我當時在的地方就有一個lucky lady,玩法就是如果玩家初始兩張牌是20點,會給相應的賠率回報,正好符合高低演算法,經過粗略測算,大致在真數超過+3的時候,這個side bet值得長期玩

其他因素:比如BJ的賠率有5:6的而非2:3,有的桌會抽1塊錢手續費,有的在dealer soft 17上規定必須加牌,甚至包括同桌玩家太愛bb降低玩牌的效率,都會影響到你的預期收益率

最後補一句,21點是賭場里輸率最小的遊戲,而通過算牌,也僅僅是小幅提升至獲得極低的收益率,前提是玩足夠多的手牌,因此還是老話,小賭怡情,大家玩好~


二十一點算牌法最早出現在六十年代初。1962年《打敗莊家(Beat the Dealer)》一書問世,向公眾系統介紹了算牌法。這不再是我們慣見的蘿蔔賭經,而是有數學基礎的方法,因為它在不同的贏牌概率p(i)時下不同的賭注b(i),雖然總的勝利概率之和Σp(i)仍然小於1/2,但只要在p(i)大時下大的b(i),p(i)小時下小的b(i),就能使總回報Σr(i)p(i)大於Σb(i)。其中的「算10法」比較難操作,需要極高的心智和注意力。

《決戰21點》中使用了高低算牌術

經過無數玩家的不懈探索,算牌方法不斷到進化,越來越簡單實用。2013年比較流行的一種叫「高低法(high-low)」。在遊戲過程中,我們把每一張出現的2,3,4,5,6都算+1點,7,8,9算0點,10,j,q,k,a算-1點,將各點相加,結果越大,就表示前面出現過的小牌越多,對玩家越有利(莊家容易拿到大牌而爆掉)。反過來,如果結果是個負數,就表示前面出過的大牌比小牌多,對莊家有利。

比如前面出現的牌是:

4,9,10,5,j,a,8,10,q,2,6,k,j,7

那麼點數就是4張小牌減7張大牌,是-3。當然,在遊戲過程中,你不可能叫莊家把牌局暫停,讓你從容加減。你必須在每張牌出來時,就在心裡默算點數。從第一張牌出現開始,你就應該在心裡默算出:

1,1,0,1,0,-1,-1,-2,-3,-2,-1,-2,-3,-3

在實際運用中,還可以採取兩張牌一計的技巧,因為莊家發牌時一般速度較快,這樣可以方便地把很多同時出現的大牌和小牌抵消不計,提高了算牌速度,減少了可能的計算錯誤。比如在上面的例子里,如果兩張牌一計,那就是:

1,1,-1,-2,-2,-2,-3

如果是一副牌,-3已經是很糟糕的點數了,這時應該下最小注,或者停止不玩。不過一般來說,賭場都使用六到八副牌,那麼在六副牌312張牌內,發出14張牌,還剩298張牌,平均每副牌的點數是(-3)×52/298=-0.5,還算可以忍受。

顯然,在每一盒牌(「盒(shoe)」是指一盒牌從開始發牌到洗牌的過程,這一盒牌里可能有六副、四副、八副或其他副數的牌)的開始,由於大部分牌還未發出,因此平均點數總是在0左右。要到牌盒裡剩下的牌不多時,平均點數才可能比較顯著地偏離0。所以算牌手在算牌時都會尋找合適的賭桌,一方面要找人少的桌子,因為人越少,你在單位時間內玩的次數越多,實際收益才會更接近期望值;另一方面要找切牌少的發牌員,因為該切多少牌,賭場只有個大概的規定,具體執行還是要靠發牌員的覺悟,所以同一家賭場里,不同的發牌員切出的牌來常會差很多。

在點數變大時,該怎麼提高賭注,每個算牌手都有自己的習慣和演算法。理論上,如果你佔a的優勢,本錢總數為r,那麼最優賭注是b=a*r。

比如你有一萬塊錢的本錢,你佔1%的優勢,那麼就應該在這把壓下一百塊錢。雖然理論上此法可以獲得最大回報,但在實踐中過於冒險,只可視為下注時的上限。

在點數為0或負數時,玩家應當下最小賭注。當然,最好是乾脆不玩,坐等點數變正。早期的那些算牌手就是這麼做的,賭場里,從游弋在各桌間的桌面經理,到高懸在天花板上的監視器,都虎視耽耽地監視著每個玩家的行為。如果總是點壞不壓、點好猛壓,還不如直接在臉上寫五個大字:「我是算牌手」,說不定還暴露得晚些。

這也是在線21點遊戲的一大優勢,沒有了背後咄咄的目光,玩家能更從容地使用所有的基本策略和算牌法,從而削弱在線賭場的優勢。


下面那位哥們說的高低演算法是算牌裡面比較常見還有是最多人用的。通過記住每張牌出來的數值你會在腦子裡面加1,減1(其他演算法數值可能會不一樣)得到的數字就是running count,數字愈大就代表接下來會出的牌會是大牌比較多10,j,q,k,A.這樣玩家的優勢(edge/advantage)就會增加了,反之running count愈小甚至負的話,小牌出的機會率比較多,相對玩家的edge 就會減少。根據count 去調整下注(比較複雜的演算法,可自行搜Kelly criterion),就會提高玩家的ev(expected value)。不過玩家的ev 不會太高,大約在0.5~1.6 average.所以是需要投入大量時間才會看到理想的回報,前提你還要每樣東西都做到完美才能有這麼一點點的優勢,所以不是每個人都能靠這個為生的。

下面有人說人數不會影響,其實是錯的。人數的確會影響,要不然80,90年代就不會有那麼多大型算牌團隊的出現了。

因為blackjack的variance (波動)很大,就好比一塊精心設計過的硬幣,字出現的機會比圖案的要高稍為1%(在這就比喻是玩家經過算牌後的ev,你買下一把會出現字。),就算你扔100次,也不見得字就會剛好出現51次,圖案那面也很有可能出現的比較多(這就相對於優勢玩家遇到的bad variance).但只要sample夠大,長期下來,扔1000次,10000次...1000000次..字出現的次數肯定會比較多。換句話說,有團隊的合作加上配合,你就可以在一天裡扔更多次硬幣了,這會愈快接近expected value同時減少variance.當然團隊的玩法不止於此,在這就不方便多說了。

(個人經驗)


推薦閱讀:

基數排序
矩陣中的路徑
重建二叉樹
雙向鏈表
6. ZigZag Conversion(medium) & 7.Reverse Integer(easy)

TAG:電影 | 演算法 |