• 诈金花自动策略研究

    发布日期:2022-04-04 20:34    点击次数:92

    诈金花自动策略研究

    为了研究诈金花自动策略,本文一共做了以下几件事情:
    依据概率论的知识,确定了单个人抽牌的概率分布,能够衡量出自己的手牌在所有手牌可能性中大概的位置;利用数理统计中次序统计量的知识,结合上文中单个人抽牌的概率分布,得到其他所有玩家的手牌都小于我们手牌的联合概率分布,换而言之,就是我们手牌获胜的概率分布;设计了一个基于手牌胜率的决策模型,用以实现诈金花的自动策略。为了确保决策模型是一个期望值为正的系统,进行了一系列的验证;对我们的策略进行实测,并根据结果对决策模型进行了改进,得到如下结论:五人场,每次主动看牌
    场上无人看牌则对4以上留;
    场上一人看牌且跟了,则对11及以上留;
    场上两人看牌且跟了,则对A及以上留;
    场上三人看牌且跟了,则顺子678及及以上留。
    以下便是我们在网上与其他玩家进行诈金花博弈时的账号净值图,可以看出本文的策略期望为正且效果良好:

    目录
    目录
    摘要
    1.诈金花游戏规则
    1.1游戏流程
    1.2牌面大小规则
    2.诈金花概率模型
    2.1排序
    2.2单人情况的抽牌概率模型
    2.3多人情况的抽牌概率模型
    2.3.1其他玩家抽牌的概率分布
    2.3.2获胜的概率分布
    2.4验证
    3.诈金花策略模型
    3.1胜率的频率
    3.2自动策略
    3.2.1策略的描述
    3.2.2策略的期望
    3.3其他策略
    3.4风险管理
    3.5钱从何来
    4.敏感性分析
    4.1阈值T取值对于系统的影响
    5.实测验证
    5.1模型结果验证
    5.2结果分析
    6.改进模型
    6.1改进模型结果验证
    6.2结果分析
    6.3策略评估
    7.算法实现
    7.1排序


    摘要
    诈金花又叫炸金花,是在全国广泛流传的一种民间多人纸牌游戏,具有独特的牌面大小规则
    ,玩家以手中的三张牌比输赢,根据条件和判断形势可以进行加、跟、看牌、放弃、开牌等操作,非常考验参与者的胆略和智慧。
    首先,本文详细的介绍了诈金花游戏的规则,并对诈金花的抽牌规律做了简单的统计分析,为后文的概率模型打下了基础。然后,本文依据概率论的知识,确定了单个人抽牌的概率分布,目的是能够衡量出自己的手牌在所有手牌可能性中大概的位置。为此,本文还创造出了一种排序算法,将每一种手牌都映射到实数域上的一个数字,实现了手牌大小的比较。
    接下来,本文利用数理统计中次序统计量的知识,结合上文中单个人抽牌的概率分布,得到其他所有玩家的手牌都小于我们手牌的联合概率分布,换而言之,就是我们手牌获胜的概率分布。最后,还利用其他研究者的数据,验证了本文模型的有效性。
    然后,本文设计了一个基于手牌胜率的决策模型,用以实现诈金花的自动策略。为了确保我们的决策模型是一个期望值为正的系统,本文进行了一系列的验证,并提出了保证系统可行的必要条件。此外,本文还提出了一种风险管理方法,以确保自己不会因为连续的不走运而亏空掉所有的资金。
    最后,本文对自动策略在网上进行了实测,发现本文的策略期望为正且效果良好:


    关键字 诈金花 概率模型 联合概率分布 正期望值的自动策略 风险管理

    1.诈金花游戏规则
    1.1游戏流程
    诈金花受众极广,规则也是千变万化,本人单就最基础的玩法进行考量,从游戏流程和牌面大小两个部分来细说这个局,首先来看看完整的一局诈金花都有哪些步骤(引自百度百科诈金花词条):
    1.投入锅底:发牌之前大家先下注来获得本局的牌权
    2.发牌:一副牌(52张无大小王),从庄家开始发牌,第一次开局的话,随机选择一个用户为庄家先发牌。每人发三张牌,牌面向下,为暗牌。
    3.游戏:游戏人数为2-6人。庄家逆时针的下一家先开始下注,其他玩家依次逆时针操作。轮到玩家操作时,玩家根据条件和判断形势可以进行加、跟、看牌、放弃、比牌等操作。
    ①看牌:没有选择“放弃”的玩家,轮到自己动作时,可以选择看自己的牌,看过的牌为明牌。可以在看牌后再选择是否跟、加,或比牌,这时你的牌就是明牌了,跟、加也是按照明牌的规矩跟、加;当然也可以暗牌操作。
    ②跟注:只要不退出牌局,每次轮到玩家时,都必须压入与单次投注数相同的筹码。
    ③加注:玩家可以增大每一回合的单次投注数。
    ④弃牌:当玩家手里的牌不够好时,可以放弃手中的筹码,退出牌局。
    4.比牌:当到达一定跟注轮数后,可以选择与玩家比牌,赢的人留下,输的人退出牌局。
    5.结算:赢者通吃。


    以上就是诈金花的游戏规则。当然,诈金花,除了好的手牌外,诈也是关键,诈能使其他玩家退却,能小牌吃大牌,也能在大牌时留住场上更多的筹码。这是从人性的角度上去考量的。
    从数学的角度上来看,抽好牌抽坏牌是个概率问题,如果能够找到一套可行的策略,衡量自己手中的牌的胜率,再根据胜率采取事先确定好的行为,从而更加理性地进行游戏,长远来看,这或许是一个期望为正的系统。
    1.2牌面大小规则
    如果想衡量自己的胜率,首先得知道什么样的牌能赢,接下来我们就介绍一下,诈金花中的牌面大小规则。
    牌面共有四种花色,分别是:黑桃,红桃,方块,梅花;
    牌面一共有13种数字,分别是 2 3 ... 9 1 0 J Q K A(1) , 其中2最小,A最大;
    牌面的大小就是从这两个方面确定的,按照下列组合,从大到小:

    可以看出来,在牌面为豹子时,数字一样,则一定不可能花色一样,这说明数字和牌面绝对不会是相互独立事件,这点在考量胜率的时候是非常重要的。
    一副牌组共52张牌参与游戏,则按照组合数C(52, 3)共有22100种可能性牌组,以“数字连号”的组合为例,共有C(12,1)*C(4,1)*C(4,1)*C(4,1)=768种可能性,其中同花顺占到48种,而顺子占720种,总体情况如下表所示:






    这便是目前比较常见的诈金花概率估计,但是这个概率并不十分准确,本人将会使用更加严谨的数学方法来推导这个问题。在下来的环节“概率模型部分”中,将会涉及到概率论中随机变量的概率分布以及联合分布函数等内容。
    2.诈金花概率模型
    上一回中,我们描述了诈金花中的牌面大小规则以及一些简单的统计分析。当我们有一个同花的时候,我们的手牌至少比所有可能的牌组的94.58%都大。
    当然,这是不够的,我们还想知道更加精确的比例,才能去估计得到精确的胜率。所以本文采用了一个简单的方法来计算自己在所有牌组中的位置。
    2.1排序
    已知现在牌库中有N张牌,则一共有组合数C(N,3)种可能牌组。每一局开始前先洗牌,然后轮流给所有人发三张牌,对于单局而言,它属于一个不放回的抽取,所以随着抽牌,特别是自己手中已经拿到牌的情况下,所有可能的牌组数已经发生了变化。比如说你拿到了红桃A,则别人就无法再拿到红桃A,也无法拿到所有包含红桃A的组合,这在一定程度上也会影响我们手牌在所有组合中的大小位置。
    因为任意两幅牌组之间都可以比大小,所以由卡牌组合出来的所有牌组,都可以从小到大排序,至于如何排序,这是一个算法问题,方法我已经想好了,很巧妙,将在篇目“编程实现”中详细的阐述。现在我们假设,所有可能的牌组都已经被大小排序,手中的任意一个牌组,
    我们都可以知道它在所有可能性当中的大小位置。
    2.2单人情况的抽牌概率模型
    让我们回到概率上,设随机变量X为本局中某个牌面组合,X是一个离散的随机变量,取值范围是由N张牌能够组成的总计C(N, 3)种牌组。已知

    ,其中

    ,即抽中任一个位置的牌组的概率都是

    ,这属于均匀分布,X的分布函数如下:

    也就是说,当我们从N张牌中任意抽取一个三张牌的牌组时,我们抽到的牌组小于等于x的概率为

    因为在同一个牌桌上,并不只有我们一个玩家,诈金花是一个2-6人的游戏,每一个的抽牌,我们都要考虑在内。这里我有一个设想,参与的人越多,就算拿到好牌,赢得概率也会比人少时更小。想想极端情况,一共有22100个人抽牌,如果我们抽到一个同花,则一定会有比我们大的人存在。这个想法我将会在描述完诈金花的概率模型后进行验证。
    2.3多人情况的抽牌概率模型
    接下来,让我们回到诈金花的概率模型中,这个模型的目的是让我们知道我们手里的牌组在牌桌上的胜率。我们知道,如果想知道自己在牌桌上的胜率,也就是确认自己的牌在场上是最大的牌组的概率。这里,我们就要对现实情况做两个假设,以方便计算。
    假设1:所有被抽取的未知牌,都当做是放回抽取,不影响下回抽牌时的概率。
    这个被抽取的未知牌,除了包括别人的牌以外,自己的牌如果未看也算在内。当然,如果自己都选择不翻牌的话,那对于概率根本就没有任何指导意义,就不考虑这种情况了。
    因为发牌过程是随机的,所以无论是谁先抽牌,结果都没什么变化,在此我们为了方便讨论,就认为每次都是我们第一个抽牌,其他的玩家的手牌都受到我们抽牌的影响(事实上,无论是第一个抽牌还是最后一个抽牌,我们的手牌对于概率的影响都一样)。
    假设2:忽略两个牌组一样大小时的大小关系比较
    按照诈金花的规则,如果两个牌组一样大时,主动比牌的人算输,但是在游戏中有时会我们主动比牌,有时会对方主动比牌,所以我们忽略牌组一样大时的大小关系比较,转而在求自己牌面于所有可能性牌组的大小位置时,取其大小一样的牌组位置的中位数。
    2.3.1其他玩家抽牌的概率分布
    这样,我们根据一个人抽牌的概率公式①,再结合上文中我们第一个抽牌的情况,得到接下来每一个玩家抽牌的概率分布函数:

    其中,因为我们是第一个抽牌的,所以接下来的所有玩家面对的只有N-3张牌的牌库组成的牌组。再根据假设,被抽取的未知牌是不影响牌库的组成的,我们可以认为,接下来所有玩家的每一个人,从N-3张牌中任意抽取一个三张牌的牌组时,抽到的牌组小于等于x的概率为

    这是我们接下来建立我们的获胜概率模型的基础。
    2.3.2获胜的概率分布
    简单来说,在诈金花中获得胜利,其实就是赢过场上所有的人。我们在抽得一手牌的时候,不仅迫切的想知道自己的牌组到底算是大还是小(这个问题在上面的单人抽牌概率模型中已经有了答案),更想知道的是,我们比场上其他人都大的可能性是多少,这就是我们要求的获胜概率。
    其实,将获胜的情况在语言上转化一下,“赢过场上所有的人”=“我们比场上其他人中最大的那个还要大”,而场上其他人中最大的是一个可以使用统计量衡量的概念。
    设场上有m位玩家,则出去我们本人外,还有m-1位玩家。统计量

    表示剩下m-1位玩家中手牌最大的那个手牌。如果我们的手牌比Y还大,则我们就是最大的那个,也就是获胜者。接下来,我们将求解统计量Y的概率分布函数:

    可以看出,统计量Y的概率分布函数实则是一个m-1维的联合分布函数。
    通过统计量Y的概率分布函数,我们可以得到在场上的任一玩家的手牌都小于等于Y的概率。如果我们的手牌是Y,那这就是我们本局获胜的概率。
    2.4验证
    本文验证部分的数据来源于shengyou liu在APP store 上发布的软件“诈金花概率论”,根据刘先生的介绍,他的应用“是利用科学的概率论和数理统计分析原理”,可以看出,通过本文的模型得到的胜率数据,与刘先生的相差无几,想必利用的方法是相似的

    以上便是本人建立的获胜概率模型,当然,只知道胜率是不够的,我们不能通过比胜率来决定胜负。所以,在下一个回中,我们来讲讲,如何用我们得到的具体胜率,来指定我们的游戏策略。
    3.诈金花策略模型
    在上一回中,本文建立了一个通过手牌推测本局胜率的概率模型,还验证了其有效性。但我们光是知道我们本局获胜的概率,还并不能保证这是一个期望为正的系统。接下来,我们要设计一个基于胜率的决策系统,实现诈金花的自动策略。
    3.1胜率的频率
    这里,我们先分析一下不同胜率的手牌出现的概率,一共有22100种手牌组合,也就是说,在我们抽手牌的时候,一种手牌对应一个胜率,一共也只有这么多种。为了直观的展现不同的胜率出现的概率有多大,我们按照每25%一档,将胜率0-100%分为了四挡,并分别求得了这四挡胜率对应的手牌出现的频率。(为了减小计算量,我们随机抽出2210种手牌,用来代表所有的手牌组合)



    五人场胜率-频率直方图可以看出,胜率越高的手牌出现的频率越低,这也是必然的。那么我们多少的胜率该采取什么样的策略,如何保证这是一个正期望的系统,如何能保证自己在场上的存活性呢?这就是接下来要讨论的事情。
    3.2自动策略
    3.2.1策略的描述
    首先,我们知道了自己手牌的胜率,如果胜率不高,自然不能投入太多,虽然有能够诈一诈对方的玩法,但这种玩法过于容易被自己的情绪所左右,对方的行为也非常难以预测,最终落得比牌的下场,依然是输。这里我们就按照对一个比较常见的套路,在胜率高的时候,加大投注,在胜率低的时候,及早离场。对此我们设定一个阈值,规定当我们手牌的胜率超过T的时候,无论其他玩家什么操作,我们一路跟下去,坚持在牌局中,直到投入我们该场牌局所带的所有资金或者其他人退出或者有人选择比牌。关于资金规模控制的事情,我们将会在后文的风险管理里提到。
    3.2.2策略的期望
    假设 所有玩家都看了牌,大家投入的赌注时的倍数是一样的,不存在有人不看牌而使其他玩家需要翻倍投注的现象。
    其他玩家牌不好退出,牌好则留下,但是至少会有一位对手玩家留在场上(全退我们就不战而胜了)。为了方便量化,我们就假设如果我们选择留下来时,赢了的收益等于我们投入的筹码S(STAKE)加上总人数减2倍的锅底(即获得本局牌权时的筹码)筹码B(BASIC)。
    既然有了固定的策略,有了阈值T,知道了获胜概率W以及各种获胜概率对应的频率R,我们就可以求得该策略的数学期望值E。假设当我们的胜率大于T的时候,我们一直保持在场中,直到结束时,我们一共投入筹码S。这意味着我们要么收益S+(N-2)*B,要么损失S。





    根据公式,我们本局的期望E为:

    事实上,牌组的频率分布是离散的,但我们为了方便表示,使用了积分的形式来展现这个连加的过程。其中R是关于W的一个函数,表示当胜率为W的手牌出现的概率为R(W),具体的数值可以通过上文胜率的频率中给出的方法求得。
    为了让我们的系统的期望值E为正,我们采取以下操作:



    继而

    也就是说,为了保证我们的诈金花策略的期望为正,我们要确保当我们的手牌胜率大于T的时候,能够每局平均留住除去锅底以外的S数量的筹码在场上。至于如何才能让牌桌上某个玩家的赌注超过S,这就是各位的技术问题了(毕竟如果一有好牌就狂押注,是会吓跑别人的,假装自己牌不好,犹犹豫豫的押注,说不定会引诱别人上当)。
    3.3其他策略
    当然,我们的策略模型也可以更加复杂,设置更多的阈值,就像数学上的分段函数那样,概率是多少时就干什么事。但从本质上来讲,这些模型和上文中的模型并没有什么区别,分析方法也和上文一样,本文就不一一列举了。
    3.4风险管理
    在诈金花的规则中,可以进行比牌,以及全压等操作。理论上来说,抽到大胜率牌的牌就意味着能够赢得牌局,所以连续输掉大胜率牌并不常见,但不可否认,这种可能性是存在的,所以我们要控制每局的资金量,才能确保自己不会因为连续在抽到大胜率牌时输掉而爆掉手中所有的资金。这就涉及到了确定我们每局上牌桌时的资金量m(也就是全压时能够涉及的所有资金)。
    首先,我们要确定,应该把总资金M分散到多少局才能保证自己不容易爆掉,这里的n代表我们把能够连续输掉的大胜率牌局数,也代表我们要把总资金分成n份。

    其中

    是我们已经抽到了胜率大于T的牌时,依然输掉的概率。
    每局上牌桌时的资金量m是根据总资金M和局数n确定的:

    通过这个方法来控制每局的资金量m,我们可以确保自己至少95%的概率,不会因为连续输掉大胜率牌而把所有钱亏光。
    3.5钱从何来
    其实,在牌桌上玩久了的人,对自己拿到的手牌,心中都会有个大概的感觉,豹子必然是大的,单牌通常很小。大部分人也都是在遵循“胜率高的时候,加大投注,在胜率低的时候,及早离场”的套路。但人的感觉并不是一个非常具体的概念,而且受到各种因素的影响非常大(比如觉得自己手气不错,笑),可能有的人在手牌并不是非常大时,突然萌生了赌一把的想法,那他输掉这场牌局的可能性还是很高的。
    4.敏感性分析
    虽然在上一回合的策略部分中,我们提到了能否在我们手牌的胜率大于T时,每局平均留住除去锅底以外的S数量的筹码是我们策略期望是否能够期望为正的关键。但是要注意,其实S是一个变量,是通过期望为正的公式算出来的。本文这个自动策略中,唯一的可调参数其实是决定我们策略的阈值T,其他的几个数值,比如获胜概率W、频率R都是通过我们的手牌计算得到的。
    所以,我们关注非常阈值T取值对于系统的影响,阈值T的选取决定了筹码S的变化,随着T的调整,或许会存在一个最小的S(最容易达到的S)。另外,我们还要关注筹码S是否会随着阈值T的变动而发生剧烈的变动,也就是了解我们所建立的策略系统是否足够稳健,能否经得起现实系统中,最优参数的微小改变。
    4.1阈值T取值对于系统的影响
    首先,我们规定实验的背景环境,设牌局为五人场,锅底B为100筹码,然后求解随着我们设定的阈值T的变化,在手牌胜率大于T时,为了保证策略系统的期望为正,我们要让牌桌上某个玩家的赌注超过S。



    当然,筹码S越小,这件事情越容易办到。可以看出,当阈值T=0.32时,我们只需要在拿到大胜率牌时促使牌桌上某个玩家的赌注超过532筹码,也就是大约5B的筹码,就能实现期望为正的系统。
    在最优值附近,阈值T每变动3%,筹码S变动了0.245%,阈值T每变动10%,筹码S变动了1.692%,可以说,整个模型是非常稳定的。
    另外,我们可以得到,当阈值T选取为0.32时,我们在每1000场牌局中,将会参与243场(即拿到牌后跟下去),所以总体的参与次数并不低,这也利用我们在策略运行的过程中发现问题。


    5.实测验证
    5.1模型结果验证
    为了验证本文的概率模型,我在网上对文中的策略进行了实测,所用的平台是软件快乐炸翻天,经过本人测试,该软件的抽牌概率部分是属于正常概率的。在第一次测试中,我们一共在炸翻天的中级房中打盘145场,以下便是账户的净值图:





    可以看出,这是一个期望为正的系统,途中每一个点都代表我们账户此时的净值,连续的一堆稳定下降的点,说明我们处于抽牌小胜率牌,然后弃牌的过程,而我们的利润则来自于偶尔出现的大胜率牌。我们对净值图取线性回归,发现回归线的斜率在60左右,也就是说平均下来,底注每盘1000筹码的局,我挣60筹码。而根据我们之前提出的理论,当我们的手牌大于0.32胜率时,我们要促使牌桌上有人投注超过5注,也就是5000筹码,根据记录,我们在145盘中共遇到41次胜率大(大于0.32)的牌,而在这41盘中,我们共计吸引筹码652500,平均每局15914,也就是说有人额外投注12915,即13注,可以说,是超过了我们的的最低需求。但是收益结果却远远低于我们的预期,这说明我们的模型还存在一定缺陷,接下来我们将从结果进行分析,改进模型。
    5.2结果分析
    抽到小胜率牌时吗,只有弃牌一条路,这个没什么可讨论的,所以问题只会出在我们抽到大胜率时的决策上,那么我们将所有抽到胜率大于0.32的牌按照25%为一档,分类三类分别进行统计。

    很明显的,我们的32%-50%胜率的牌,让我们损失了不少利润。低胜率的牌会损失钱倒也合理,如果我们无端的把这部分砍掉,那么一旦我们拿到好牌,也不会有人往里面跟。不过呢,这个损失的量是否合理,我们的模型是否合理,就是接下来要验证的内容。
    表格中红色的部分,指的是在我们抽到牌以后,牌桌上的其他人看完牌要么直接弃牌,要么跟了一轮后弃牌,而到达最后比牌阶段的只要9场,赢得比牌的只有1场,虽说样本不多,但这胜率也太低了。再看50%-75%胜率的牌,到达最后比牌阶段的要11场,胜利的有5场,也是低于我们的最低期望的。这说明一个问题,如果当对方,并不弃牌,而是选择跟注并最终和我们比牌时,对方对自己的手牌是有一定自信的,此时我们的获胜概率已经发生改变,这是一个条件概率。当对方弃牌,我们虽然赢了牌局,但最终的收益也只有一个锅底,而对方选择留下时,我们的胜率是远低于我们之前的期望的。输多赢少,自然会导致利润的损失。


    6.改进模型
    前面我们分析了模型之所以没有达到期望收益的可能原因,接下来我们将对模型就此提出一些改动,将在同一个牌局上其他玩家的行为纳入到模型中去。
    假设 当其他玩家在看牌以后,没有弃牌,则说明他们的手牌并不小
    虽然有些玩家在玩诈金花的时候会使诈,很小的手牌估计跟注加注,但就大多数情况而言,如果一个人看了牌后,依然跟注,至少他的手牌不会太小。此时我们在估计他手牌的时候,就不应该按照“获胜概率模型”去计算我们胜率,而是计算一个条件概率,即在他的手牌大于等于某一牌面的条件下,我们的胜率。
    至于对方会在多大的牌面留下,这就需要通过大量的数据进行参数估计,得到一个多数人的平均值,只要我们的样本够大,根据大数定律,我们定可以得到一个合理的临界值。
    这里假设大家普遍在发现自己手牌是Xab(abandon)后弃牌,那根据先前的“其他玩家抽牌的概率模型”我们可以得到当一个玩家看牌后后依然跟注,则他抽牌的概率分布函数应为:

    同理,当一个牌局里有n个人都是看牌后跟注时,我们的获胜概率模型应为:

    可以看出,改进后的概率分布函数实则是一个m-1维的联合分布函数,是由未看牌的玩家的抽牌的概率分布函数和看牌不弃玩家的抽牌的概率分布函数组成,如果没有玩家看牌且不弃牌,则该模型与上文中的原始获胜概率模型一致。
    6.1改进模型结果验证
    因为没有足够数据去估计其他玩家的弃牌临界点,我们只能做出一个基本假设,认为其他玩家只有拿到不是单牌的情况下,才会选择留下并跟注。以此作为临界值,根据上文提出的改进模型,我们对所有可能性的手牌进行计算,最终得到以下结论:
    五人场,每次主动看牌
    场上无人看牌则对4以上留;
    场上一人看牌且跟了,则对11及以上留;
    场上两人看牌且跟了,则对A及以上留;
    场上三人看牌且跟了,则顺子678及及以上留。
    在第二次测试中,我们一共在炸翻天的中级房中与其他玩家打盘370盘,以下便是账户的净值图:





    可以看出,在第一次测试中那种经常会出现的大损失已经被缓慢的衰落取而代之,这也就意味着在对方手牌不错的情况下,我们及时的退了场,只损失了一个锅底的筹码。当然,接下来还需要进行具体的分析。
    6.2结果分析
    和之前一样,我们将所有抽到胜率大于0.32的牌按照25%为一档,分类三类分别进行统计。

    表格中红色的部分,指的是在我们抽到牌以后,牌桌上的其他人看完牌要么直接弃牌,要么跟了一轮后弃牌的情况,而蓝色指的是当牌桌上有人看牌后继续跟,我们根据改进模型重新设定弃牌临界值后,判断应该弃牌的情况。与第一次测试的数据相比,75%-100%胜率的手牌盈亏改变不大(之所以会场均多了6000,是因为我在有一局拿到的手牌不错,就一局下了10w的筹码导致的,若是刨除这一局的话,场均应在2.2w左右),而32%-50%与50%-75%胜率的牌收益情况变化显著。这主要是因为对方牌不是很差时,我们原本胜率不是很大的牌,更加受到影响,而我们拿到胜率很高的牌时,对方就算不是很差,也很难超过我们,所以影响较小。可以看到,在上表中32%-50%胜率的手牌出现了大量因为对方跟牌而弃牌的情况,虽然每次都会损失一注到两注的筹码,但相对于可能出现的二三十注的损失,是挽回了很多利润的。
    6.3策略评估
    为了能够更直观的去评估本文的策略,我们采用了常用的交易指标评估方法,具体情况如下表所示:

    可以看出,本策略是通过少数几次盈利,来弥补在场中的持续损失,并获得利润的,执行这个策略需要很好的心理素质,不然很可能会错过我们获得利润的机会。此外,回撤比较大也是一个缺点,在实际操作过程中,需要据此和我们的总资金量来调整每局的单注大小。


    7.算法实现
    在之前的章节中,我们已经将完整的诈金花自动策略讲述完毕了。在这一章节中,我们将详细的描述一下,自动决策系统在实行时会遇到的编程问题,并给出相应的算法给予解决。
    7.1排序
    在本文中,我们是通过寻找我们的手牌在所有可能的牌组中的大小位置来确定抽牌的概率的,而确定大小位置的的前提是我们将所有可能的牌组都进行了大小排序。为此,本文提出了一种特殊的映射关系,为每一种牌组都提供了一个索引,这个索引还能够体现它们之间的大小关系。
    首先,根据规则书,我们知道牌面的大小是从两方面确定的,一是特定的组合,不同的组合之间有着绝对的大小关系,具体情况就如下表所示,上大下小:

    而在同一个组合内时,则依据牌组内最大的牌进行比较,如果在最大的牌相同,再比较次大的牌,总之最后总能分出个胜负平。


    首先,为了能够确定我们手中的牌到底是属于什么组合,我们构建以下决策树:







    然后,我们设计以下映射关系,将每一种手牌对应到一个实数域上的七位数。显然,因为,从某种程度上来说,这是一个满射(当然不是实数域上的)。
    为了能够让手牌映射的七位数直接代表牌组的的大小,我们要做出两点改动
    将组合按照大小编号将A(1)用14替代,因为A(1)是比K还要大的牌面,这是与实数空间不同的地方。
    则,依据上面的两个改动,以及我们建立的映射关系,我们可以的得到下表:

    就如同表中所示,黑桃A、红桃A、方块A对应数字6141414,红桃J、红桃A、红桃5对应数字4141105 。这样,牌组的大小就转化为了数字的大小,排序也就是易如反掌的事情。
    要注意的一点是,如果组合是对子,则排在数字(大)和数字(中)应该是组成对子的数字,零散的那张放在最后,因为对子组合比大小时,是先比较对子的大小。

    血流麻将的庄家有14张牌,可以率先出牌,其余玩家每人13张牌,在游戏的过程中世界赌场名单,玩家可以碰、可以杠,但就是不能吃,碰过和杠过的牌都要亮明在桌面。玩家如果在其他玩家打牌的时候引杠,然后再杠上花,算作自摸。在血流麻将中,点炮者输点与其他玩家无关,如果一炮点了两家以上,点炮者还输了,那么点炮者成为下一局游戏的庄家。血流麻将的最后四张牌,如果能胡自动算胡。