星露谷物语吧 关注:564,995贴子:3,282,871
  • 16回复贴,共1

关于沙漠21点的一些计算

只看楼主收藏回复

看了下吧里貌似没有详细计算这个小游戏的贴,就自己算了下(如果有...那就当无事发生吧),详细见楼下


IP属地:四川1楼2022-07-08 01:45回复
    先说结论吧,
    最优选择是庄家亮的牌为8或9时,手牌大于等于19时stand;其余时手牌大于等于18时stand
    以此方法各结果概率比为:win:lose:draw≈5.4:4.0:0.6


    IP属地:四川2楼2022-07-08 01:45
    收起回复
      2025-12-24 15:57:37
      广告
      不感兴趣
      开通SVIP免广告
      规则(本人没有系统学过C#,对该游戏源代码未能完全理解,不过应该是没有问题):
      1.双方在开始时抽两张,第一次抽牌范围是1~11,之后抽牌范围为1~9(庄家第三次抽牌及以后可能会触发直接强制超过21点,具体概率见之后),庄家第一张牌不亮出
      2.玩家开始选择hit或stand,大于21时直接判负,等于21时直接判胜
      3.玩家stand后,庄家hit,庄家必须保证手牌>=18并且>=玩家手牌,当庄家超过21时游戏判胜,当庄家与玩家手牌相同且满足>=18时直接判平,其余判负
      4.游戏内抽牌与当日运气无关,一般为均匀分布,在一些情况下有补正,如下

      上图为玩家发牌程序源代码,由291行可以看出,在玩家总点数为16~19时,玩家的抽牌有1/(21-点数)的概率被等概率替换为20或21

      这张为庄家的抽牌程序源代码,由165~177行可已看出,在玩家总点数为20、19、18时,庄家的每一次抽牌分别有0.5、0.25、0.1的概率直接超过21点


      IP属地:四川3楼2022-07-08 01:48
      回复
        最优选择算法:
        可能影响选择的因素:庄家的亮牌、玩家的总点数
        玩家总点数<13时必定hit,故只用计算13~20时的最优选择
        一、写出发牌程序
        根据以上规则写出发牌程序(写的比较随意):


        IP属地:四川4楼2022-07-08 01:48
        回复
          二、各个情况选择stand的胜率
          选择stand的情况较为简单,并且可作为计算选择hit的基础。计算过程将庄家的每种亮牌和玩家每种手牌总点数第一次>=13时的值作为条件,每种情况均运行十万次,以此计算各个结果的概率。程序与结果的整理如下两图:



          IP属地:四川5楼2022-07-08 01:49
          回复
            三、各个情况选择hit,并且之后选择最优选择的胜率
            正如标题,由于选择hit之后可能会出现第二次及更多的选择,故在每种情况选着hit后均按已知的最优选择进行,所以我们的计算将会从20~13逆向进行,以逐步确定每种情况的最优选择。选择标准以Ex=win-lose的值为准,比较hit与stand的该值选择较大的一项。
            在程序中,hit之后的情况若最优选择为stand则给三种结果加上上一结论中三种情况的期望值,而hit之后的最优选择若为hit则继续直到最优选择为stand。以此可以逐步得出选择hit的胜率与stand胜率的对比(表中上方为stand,下方为hit,红色部分为选择hit,黑色部分为选择stand),程序的选择条件及处理方法也就可以逐渐加上,结果如下图:




            IP属地:四川6楼2022-07-08 01:51
            回复
              四、得出最优选择
              由上述结果可以看出,由于选择hit或stand的情况没有间隔出现,这使得我们的程序及结论将会变得简单,得出的最优选择为:庄家亮的牌为8或9时,手牌>=19时stand;其余亮牌时,手牌>=18时stand。


              IP属地:四川7楼2022-07-08 01:51
              回复
                五、计算结果的期望值
                通过最优选择我们可以结合上面那张胜率表里的值,得出手牌为13~21时结果的期望值(庄家亮牌1~9为均匀分布),再通过程序计算出手牌第一次>=13时,手牌为13~21各个值的概率,即可计算出最终结果的期望值如下图:

                最后通过程序模拟验证,及按照最优选择运行,程序及结果如下:

                通过程序模拟出来的结果与计算出来的结果有一定误差,不过在允许范围之内(以上数据的均有10^-3数量级的误差)。及按最优选择进行游戏,最终win:lose:draw大致为5.4:4.0:0.6


                IP属地:四川8楼2022-07-08 01:53
                回复
                  2025-12-24 15:51:37
                  广告
                  不感兴趣
                  开通SVIP免广告
                  最后写一些题外话吧,在第一次计算的时候没有看源代码,直接按均匀分布来算的,算出来胜率比约为4:5:1,算出来还挺激动的,结果去游戏试了一百多吧,发现居然赢多输少,去测了一下欧气,发现也不欧啊,然后查了半天程序没找出问题。放了一会,突然想到会不会是发牌不均匀,然后为了看源代码,又去查了如何反编译,又弄了半天,终于把源代码弄出来了,然后一看…我**没学过C#啊…凭借我那可怜的一点C语言基础知识,又琢磨了半天,终于看懂了了那两个补正是怎么来的。于是又回去重写改代码,还好这次只用改一下发牌的函数就行,然后就有了现在这个水经验的东西。如果这次还是有哪里算错了的话…那就让它错吧,实在是肝不动了,回农场627了。


                  IP属地:四川9楼2022-07-08 01:56
                  回复
                    好贴,希望能出一个傻瓜版本


                    IP属地:浙江来自Android客户端10楼2022-07-08 02:53
                    回复
                      太高端了,我选择无脑摇老虎机


                      IP属地:宁夏来自Android客户端12楼2022-07-08 07:09
                      回复
                        补充一点
                        六、如何加注
                        此段是在默认玩家拥有足够的初始资金前提下计算的(也就是说在脸黑连输的情况下也不会把钱输没,以保证赌局进行足够多的次数),通过上述胜率,对比不同最大加注次数的场均收益(以100赌桌为例,1000赌桌乘以10就行了),最大加注次数为0~99(更大就没有实际意义了,虽然99也大到没什么意义了…)的场均收益程序及结果如下:



                        由上述结果可以看出,当最大加注次数为6次时,场均收益最高,为1711


                        IP属地:四川13楼2022-07-08 20:00
                        收起回复
                          其实到18、19、20可以停了,基本都能赢,除非运气特别不好


                          IP属地:江西来自Android客户端14楼2022-07-08 23:17
                          回复
                            绝对暗改过了,我就是18,19,20听的他要么比我大要么就一样,我还是很幸运的时候去的


                            IP属地:浙江来自iPhone客户端15楼2022-12-06 16:00
                            回复