首页 > 其他分享 >二十一点玩家策略分析

二十一点玩家策略分析

时间:2024-04-22 11:11:38浏览次数:30  
标签:策略 二十 要牌 玩家 胜率 庄家 点数

二十一点玩家策略分析

我从很早开始就对二十一点(BlackJack)这个游戏感兴趣了,应该是从看了 决胜 21 点 这个电影开始的吧。前两天,我开始思考,是否真的存在电影中所说的某种方法,来降低庄家的优势,甚至战胜庄家呢?答案是确实存在某种方法降低庄家优势,但战胜庄家是不可能的。或许在过去游戏规则尚不完善的情况下是可能,但在如今是不可能的事情。

基本规则

  1. 目标: 游戏的目标是通过将手中的牌的点数总和尽量接近或达到 21 点,但不能超过 21 点。

  2. 牌面点数: 游戏使用一副或多副扑克牌(去掉大小王),每张牌的点数如下:

    1. Ace:1 点或 11 点(玩家选择)。
    2. 2 - 10:对应的点数。
    3. J、Q、K:均算作10点。
  3. 游戏流程:

    1. 游戏开始时,玩家和庄家分别会发两张牌,庄家一张明牌一张暗牌。
    2. 玩家可以选择要牌或停牌。
      1. 要牌:玩家可以继续获得额外的牌,直到选择停牌或者手中牌的总点数超过 21 点为止。
      2. 停牌:玩家决定不再要牌,轮到庄家出牌。
    3. 庄家在玩家停牌后揭开暗牌,根据一定的规则决定是否继续要牌:
      1. 如果庄家手中的牌总点数小于 17 点,则必须要牌。
      2. 如果庄家手中的牌总点数大于等于 17 点,则不能再要牌。
    4. 最后,比较玩家和庄家的牌,点数最接近 21 点且不超过 21 点的一方获胜。如果玩家和庄家的点数相同,则为平局,玩家不输不赢。
  4. 其他规则:

    1. 如果玩家获得 21 点(一张 A 和一张 10 点牌),称为“黑杰克”(Blackjack),通常会获得额外的奖励。如果庄家和玩家都是黑杰克,则为平局。
    2. 玩家可以选择加倍下注或者分牌、保险等特殊操作,在下面分析中暂不考虑。

程序模拟

根据 澳门二十一点规则 ,我们可以通过代码实现二十一点程序。在程序中,玩家只考虑要牌和停牌操作,不考虑加倍下注、分牌、保险等特殊操作。

基础数学

蒙特卡洛方法

为了计算玩家的胜率,我们使用蒙特卡洛方法进行模拟。蒙特卡洛方法是一种基于概率统计的数值计算方法,通过随机抽样来解决问题,其核心思想是通过随机抽样来近似求解问题,从而得到问题的近似解。 根据蒙特卡洛方法,我们可以对二十一点程序进行千万次模拟,来逼近真实概率。

凯利公式

假设博弈胜率为 \(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

相关文章

  • 玩家角色——跳上平台
    目的玩家可以直接跳上平台思路将平台的物品类型设置为一个新的类型角色跳跃的时候使其胶囊体的碰撞通道可以忽略这个平台的类型角色下落时(Tick)通过射线检测下方是否是平台类型的物件,如果是则开启碰撞1.设置一个新的平台类型2.玩家角色跳跃时忽略该类型碰撞3.编写一个......
  • ASO布局策略,如何布局优化才能让产品快速成长?
    在面对黑色的8月,苹果爸爸闹脾气后,各种应用的下架、清词、清榜以及调整评论权重的一阵闹腾,可是把做ASO优化的小伙伴和开发小哥哥们,搞得鸡飞狗跳不得安宁。在面对慢慢把自己的主场进行的打扫干净的苹果爸爸,刚上架的app产品要怎样才能做好ASO优化呢?历经千辛万苦开发,准备上架的app怎......
  • 道具——玩家近战攻击升级
    目的玩家拾取物的一种玩家拾取后会增加玩家的近战攻击的伤害和攻击范围思路和技能拾取物的逻辑一致,但更加简单通过修改玩家的攻击数值和伤害判定范围以及特效显示范围的参数来达成目的1.新建攻击升级拾取物蓝图通过接口事件制作2.玩家角色蓝图中实现接口3.在角色动......
  • 52条SQL语句性能优化策略,建议收藏
    52条SQL语句性能优化策略,建议收藏Bug哥不定时发布Java类技术文​关注 585人赞同了该文章本文会提到52条SQL语句性能优化策略。1、对查询进行优化,应尽量避免全表扫描,首先应考虑在WHERE及ORDERBY涉及的列上建立索引。2、应尽量避免在WHERE......
  • MySQL安全登录策略
    原文链接:https://blog.csdn.net/weixin_46106069/article/details/129183418今天看到了安装validate_password插件,查下是什么,学习下。MySQL密码复杂度策略设置:MySQL系统自带有validate_password插件,此插件可以验证密码强度,未达到规定强度的密码则不允许被设置。MySQL5.7......
  • windows11 配置账户登录锁定策略
    原文链接:https://blog.csdn.net/weixin_46119529/article/details/134162164一、打开本地策略有两种方法,都可以!!1、搜索“组策略”,或者 2、Win键+R输入“secpol.msc” 二、打开配置界面1、如果是搜索“组策略”,按以下步骤:      2、如果是Win键+R输入“sec......
  • Python量化交易系统实战--设计交易策略:选股策略
     作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢! 这一节主要是了解基于“动量因子”的选股策略。动量因子指的是股票在一段周期内的涨跌幅度,其本质是追涨杀跌。而选股策略,指的是基于这个因子的表现进行股票筛选,以及买入、卖出的操作。该......
  • UI——玩家HUD
    目的创建HUD控件蓝图玩家角色蓝图中调用HUD结果1.创建HUD控件蓝图设计UI(详略)构造函数中获取玩家蓝图(方便之后的调用)编写通信逻辑,玩家血量变化的文字注意:文本格式化的语法固定文字+{参数名字}2.玩家角色蓝图中调用HUD初始化HUD在受击事件的宏中关联玩家血量百分......
  • Java并发(二十五)----异步模式之生产者/消费者
    1.定义要点与Java并发(二十二)----同步模式之保护性暂停中的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程一一对应这样的好处是消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据......
  • 【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句
    问题描述在为APIM服务配置了诊断日志(DiagnosticSetting),把日志收集在LogAWorkspace中,需要验证日志中是否能查看到请求的错误信息。所以想人为的来制造一些错误。经过网络搜索,参考Policy的文档介绍后,完成了以下3种错误 第一种:使用 return-response返回指定错误码retu......