二十一点玩家策略分析
我从很早开始就对二十一点(BlackJack)这个游戏感兴趣了,应该是从看了 决胜 21 点 这个电影开始的吧。前两天,我开始思考,是否真的存在电影中所说的某种方法,来降低庄家的优势,甚至战胜庄家呢?答案是确实存在某种方法降低庄家优势,但战胜庄家是不可能的。或许在过去游戏规则尚不完善的情况下是可能,但在如今是不可能的事情。
基本规则
-
目标: 游戏的目标是通过将手中的牌的点数总和尽量接近或达到 21 点,但不能超过 21 点。
-
牌面点数: 游戏使用一副或多副扑克牌(去掉大小王),每张牌的点数如下:
- Ace:1 点或 11 点(玩家选择)。
- 2 - 10:对应的点数。
- J、Q、K:均算作10点。
-
游戏流程:
- 游戏开始时,玩家和庄家分别会发两张牌,庄家一张明牌一张暗牌。
- 玩家可以选择要牌或停牌。
- 要牌:玩家可以继续获得额外的牌,直到选择停牌或者手中牌的总点数超过 21 点为止。
- 停牌:玩家决定不再要牌,轮到庄家出牌。
- 庄家在玩家停牌后揭开暗牌,根据一定的规则决定是否继续要牌:
- 如果庄家手中的牌总点数小于 17 点,则必须要牌。
- 如果庄家手中的牌总点数大于等于 17 点,则不能再要牌。
- 最后,比较玩家和庄家的牌,点数最接近 21 点且不超过 21 点的一方获胜。如果玩家和庄家的点数相同,则为平局,玩家不输不赢。
-
其他规则:
- 如果玩家获得 21 点(一张 A 和一张 10 点牌),称为“黑杰克”(Blackjack),通常会获得额外的奖励。如果庄家和玩家都是黑杰克,则为平局。
- 玩家可以选择加倍下注或者分牌、保险等特殊操作,在下面分析中暂不考虑。
程序模拟
根据 澳门二十一点规则 ,我们可以通过代码实现二十一点程序。在程序中,玩家只考虑要牌和停牌操作,不考虑加倍下注、分牌、保险等特殊操作。
基础数学
蒙特卡洛方法
为了计算玩家的胜率,我们使用蒙特卡洛方法进行模拟。蒙特卡洛方法是一种基于概率统计的数值计算方法,通过随机抽样来解决问题,其核心思想是通过随机抽样来近似求解问题,从而得到问题的近似解。 根据蒙特卡洛方法,我们可以对二十一点程序进行千万次模拟,来逼近真实概率。
凯利公式
假设博弈胜率为 \(p\) 收益为 \(b\),败率为 \(q\) 损失为 \(a\)(或称赔率为 \(a:b\)),当前最优投资比率为 \(f\),其中 \(q=1-p\)。
设初始本金为 \(M_{0}\) ,那么 \(n\) 次博弈后的期望本金为 \(M_{n}\) 为
\[M_{n}=M_{0}(1+fb)^{np}(1-fa)^{nq} \]定义每一轮的收益率为 \(R=(\frac{M_{n}}{M_{0}})^{\frac{1}{n}}\) ,整理上面的式子得到
\[R=(1+fb)^{p}(1-fa)^{q} \]两边化为 \(ln\) 并求解 \(\frac{dR}{df}=0\),可以得到 \(f\) 的解为
\[f=\frac{p}{a}-\frac{q}{b}=\frac{p}{a}-\frac{1-p}{b} \]也即当 \(f\) 取得上述值时,每一轮的收益率 \(R\) 取最大值。
在一般情况下,赔率中的 \(a=1\) ,那么可以简化上述表达式为
\[f=p-\frac{q}{b}=p-\frac{1-p}{b} \]胜率计算
在二十一点游戏中,玩家可以根据当前手牌和庄家的明牌采取不同的策略,来提升玩家胜率以及收益期望。如果采用恰当的策略,甚至可以击败庄家。此处的击败庄家的含义是,玩家的收益期望大于零。只要玩家收益期望大于零,那么连续赌下去,收益必定为正。
策略一
策略一:只要手牌点数小于等于 11,则必须要牌。如果点数大于等于 12 ,则一定停牌。采用此策略的原因为,如果点数小于等于 11 ,那么要牌后一定不爆牌。如果点数大于等于 12,那么将存在爆牌风险。这是保守主义者使用的策略。
假设玩家采用策略一,在程序中进行千万次蒙特卡洛模拟,统计结果如下:
胜率约为 41.7%,败率约为 52.0%,平率约为 6.3%。如果每次下注 100,则收益期望为 -8.7。
综上,策略一是最简单的策略,同时也是庄家拥有非常大优势的策略。依靠策略一是无法打败庄家的。
策略二
为提升策略一的胜率,我们研究当手牌点数大于等于 12 时,满足什么条件继续要牌,满足什么条件立即停牌。我们可以知道,只要计算玩家继续要牌的胜率 \(P_{h}\) 和玩家立即停牌的胜率 \(P_{s}\),然后对比胜率即可。由上述分析我们得到策略二。
策略二:只要手牌点数小于等于 11,则必须要牌。如果手牌点数大于 12,则计算 \(P_{h}\) 和 \(P_{s}\) 的值。如果 \(P_{h}>P_{s}\) ,那么玩家继续要牌。如果 \(P_{h}<P_{s}\) ,那么玩家立即停牌。
在一次对局中,实时根据当前卡堆、玩家手牌和庄家点数精确得到 \(P_{h}\) 和 \(P_{s}\) 是非常耗时的。为解决上面的问题,我们可以离线计算最佳策略。下面对每一个元素均进行十万次模拟得到的离线策略表。
策略表一。策略表一是在澳门二十一点规则下进行百万次蒙特卡洛模拟的结果,因此只适合澳门二十一点规则。 _strategyTable[i][j]
表示玩家手牌点数之和为 12 + i 且庄家手牌字面点数为 j 时的策略,值为 1 表示要牌,值为 0 表示停牌,值为 -1 表示非法操作。
private readonly int[,] strategyTable = new int[10, 11]
{
{ -1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1 },
{ -1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1 },
{ -1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1 },
{ -1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
{ -1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
}
假设玩家采用策略二和策略表一,在程序中进行千万次蒙特卡洛模拟,统计结果如下:
胜率约为 42.8%,败率约为 49.2%,平率约为 8.0%。如果每次下注 100,则收益期望为 -4.8。
策略表二。下面参考 二十一点基础策略表 进行模拟。
假设玩家采用策略二和策略表二,在程序中进行千万次蒙特卡洛模拟,统计结果如下:
胜率约为 42.3%,败率约为 48.8%,平率约为 8.9%,如果每次下注 100,则收益期望为 -5.0。
综上,策略二对比策略一,降低了庄家优势,使玩家的收益期望从 -8.7 提升到 -4.8。由此可见,只要玩家采取合适的策略,确实可以提升玩家优势。在策略二中,玩家采用不同的策略表也会导致玩家收益期望的变化,玩家必须使用最优策略表或实时计算当前局面的最优策略(玩家是不可能做到的,必须借助计算机),才能最大限度的发挥策略二的优势。当然,由于收益期望仍然为负数,因此仍然无法打败庄家。
策略三
如果在一场博弈后,庄家没有重新洗牌,而是继续从卡堆中抽卡来进行下一局,那么必然会使卡堆的数量越来越少。卡堆数量越少,玩家的可以得知的信息就越多,而这就是玩家战胜庄家的关键。假如玩家实时跟踪卡堆中牌的数量,玩家将有机会战胜庄家,即使玩家收益期望值为正数。如果庄家在每一场博弈后,就立即洗牌,那么玩家永远无法战胜庄家。
在接下来,我们将考虑卡堆会随着每局的进行而减少的情况。在策略一和策略二中,均未考虑此情况。
一般而言,如果卡堆中大点数牌(比如 Ace,10,J,Q,K 等等)的数量相对较少,那么对于玩家是劣势的。如果卡堆中小点数牌(比如 2,3,4,5,6 等等)的数量相对较少,那么对于玩家是优势的。因此,玩家可以对已经出现的牌进行计数,计数值从 0 开始计算。如果出现小点数,那么计数值 + 1。如果出现大点数,那么计数值 - 1。在下一局,玩家可以根据计数值来得知,当前局面是对庄家有利,还是对玩家有利。
在 21 点游戏中,最有名同时最简单的算牌方法是 Hi-Lo算牌法。如果出现 2,3,4,5,6 ,则计数值 + 1,如果出现 Ace,10,J,Q,K ,则计数值 -1 。计数值越大,则对玩家越有利,此时开始下大注。计数值最小,则对庄家越有利,此时开始下小注或者停止对局。由上述分析,我们基于策略二得到策略三。
策略三:只要手牌点数小于等于 11,则必须要牌。如果手牌点数大于 12,则计算 \(P_{h}\) 和 \(P_{s}\) 的值。如果 \(P_{h}>P_{s}\) ,那么玩家继续要牌。如果 \(P_{h}<P_{s}\) ,那么玩家立即停牌。在每一次博弈时,通过 Hi-Lo 算牌法进行计数,如果计数值越大,则玩家下注的筹码越多。如果计数值越小,则玩家下注的筹码越少或者停止赌博。
假设玩家采用策略三,在程序中模拟 1 副扑克牌,只要卡堆中牌的数量小于等于一半就重新洗牌,每次洗牌时通过调整牌的数量强制使 Hi-Lo 计数值为 +5,进行一百次蒙特卡洛模拟来实时计算要牌/停牌最优策略(不需要太精确,一百次已经够用),并进行百万次蒙特卡洛模拟连续博弈,统计结果如下:
胜率约为 43.6%,败率约为 48.1%,平率约为 8.3%。如果每次下注 100,则收益期望约为 -2.55。
其他不变,修改每次洗牌时强制使 Hi-Lo 计数值为 +10,统计结果如下:
胜率约为 44.0%,败率约为 46.4%,平率约为 9.53%。如果每次下注 100,则收益期望约为 0.1。
其他不变,修改每次洗牌时强制使 Hi-Lo 计数值为 +15,统计结果如下:
胜率约为 43.6%,败率约为 44.4%,平率约为 12.0%。如果每次下注 100,则收益期望约为 2.5。
在 Hi-Lo 计数值为大于 +10 时,我们成功战胜了庄家!使收益期望值为正数!
虽然玩家胜率始终低于庄家胜率,但由于存在玩家 BlackJack 时 1:1.5 赔率的规则,因此使得最终的收益期望值为正数。模拟时使用的扑克牌副数为 1,而实际的 Hi-Lo 计数值,应该乘以扑克牌的副数。对于一百次模拟计算要牌/停牌最优策略,玩家可以在实际博弈时粗略的根据策略表得到要牌/停牌策略。综上,我们可以修改上述策略三的内容,得到优化后的策略三。
策略三(优化版):只要手牌点数小于等于 11,则必须要牌。如果手牌点数大于 12,则根据策略表进行要牌/停牌。在每一次博弈时,通过 Hi-Lo 算牌法进行计数,如果计数值大于等于 10 * 扑克牌副数,则玩家根据凯利公式进行下注。否则,玩家应当下最小注的筹码,甚至停止博弈。
在上面的分析中我们知道,在 Hi-Lo 计数值大于等于 10 * 扑克牌副数的情况下玩家战胜庄家,但在普遍情况下,玩家真的能战胜庄家吗?几乎不可能。我通过程序进行一千万次连续博弈,在一副扑克并且少于一半时立即洗牌,出现 Hi-Lo 计数值大于等于 10 的情况只有可怜的 9800 次,平均而言,只有一千次博弈,才能换来一次玩家优势。对于一般的玩家,经历一千次博弈,早已身心俱疲或者筹码早输光。
标签:策略,二十,要牌,玩家,胜率,庄家,点数 From: https://www.cnblogs.com/kkelin/p/18150242