百科问答小站 logo
百科问答小站 font logo



游戏只有一个玩家,有 1~9 九张牌,掷俩骰子并设点数之和为 n,此时(详见描述)……? 第1页

  

user avatar   liu-yang-zhou-23 网友的相关建议: 
      

谢邀.


我将题主的问题编辑、整理了一下,希望符合出题人的原意:

问:

整个游戏只有一位玩家,有 1~9 九张牌,掷俩骰子并设点数之和为 n,此时有两种出牌的策略: 一是出点数为 n 的牌;二是出两张点数之和为 n 的牌. 将九张牌全部打出算赢,求赢的概率?

例:

  1. 假设投掷俩骰子点数为:2,5;
  2. 求和 2+5=7;
  3. 有两种出牌的策略:
  • 出 7
  • 或出(1,6);或出(2,5);或出(3,4)

PS:此题隐含游戏输了的情况,即当所掷点数之和,没有对应的出牌策略,即判定为输:

例:

假设投掷俩骰子点数为:2,5,而当前的手牌只有 8、9 ,判定为输.


答:

既然题主选择的话题标签中有“程序员”,那么我用程序回答算是正中下怀吧,以下使用的是 R 语言:

这是进行一次完整游戏的策略序列,可以玩玩,

       game0<-function(n=9) {     l<-n     poker<-0:n     while(l>0)     {         a<-ceiling(runif(2,0,6))         toss<-data.frame(a[1],a[2],fix.empty.names = FALSE)         row.names(toss)='toss'         print(toss)    #投掷两枚骰子          a=sum(a)         option<-c()         for(i in poker)    #生成出牌策略全空间         {             if(is.element(a-i,poker)&i!=a-i)option<-c(option,i)         }         m<-length(option)         if(m==0)return(list('Remainder Pokers'=poker[-1]))          b<-ceiling(runif(1,0,m))    #随机选择策略         op<-option[b]         if(op==0)op=a         card<-data.frame(op,a-op,fix.empty.names = FALSE)         row.names(card)='card'         print(card)    #出牌                  c=which(poker==op)         poker<-poker[-c]         l<-l-1         if(op!=a)         {             d=which(poker==(a-op))             poker<-poker[-d]             l<-l-1         }     }     return(list('Remainder Pokers'=NULL)) }     

某次运行结果——

       > game0()          toss 5 4          card 6 3          toss 5 3          card 7 1          toss 6 1          card 5 2          toss 5 4          card 9 0          toss 3 3 $`Remainder Pokers` [1] 4 8     

分享网址:

(在线测试代码的排版一般,并且有些命令不识别,但是不影响输出结果)

接下来回答胜率问题:

       game<-function(n=9) {     l<-n     poker<-0:n     while(l>0)     {         a<-ceiling(runif(2,0,6))         a=sum(a)         option<-c()         for(i in poker)         {             if(is.element(a-i,poker)&i!=a-i)option<-c(option,i)         }         m<-length(option)         if(m==0)return(length(poker[-1]))    #输出剩余牌数         b<-ceiling(runif(1,0,m))         op<-option[b]         if(op==0)op=a                  c=which(poker==op)         poker<-poker[-c]         l<-l-1         if(op!=a)         {             d=which(poker==(a-op))             poker<-poker[-d]             l<-l-1         }     }     return(0)    #否则牌全部出完,胜! }  test<-function(n)    #进行 n 次实验,输出胜率(频率) {     win<-0     for(i in 1:n)if(game()==0)win<-win+1     win/n     win<-data.frame('Winning Percentage'=win/n)     row.names(win)=''     print(win) }     

某次运行结果:

       > test(1000000)  Winning.Percentage             0.02571     

胜率约为 2.6%


可以试试——

分享网址:




  

相关话题

  为何可以用不动点法求数列通项公式,可不可以解释一下? 
  如何证明这个Tauber定理? 
  根据策梅洛定理,中国象棋是不是应该红方必胜或必和棋(看补充)? 
  洗澡的时候突然论证出了1等于0,2等于0,所有数等于0,这个论证哪里错了呢? 
  这几个不等式如何证明? 
  圆周率的这个连分数展开式怎么证明? 
  作为程序员,是什么让你坚持不懈地学习?难道不累吗? 
  国外的程序员是如何保养「革命的本钱」? 
  如何证明如下积分等式? 
  怎么形象地理解对偶空间(Dual Vector Space)? 

前一个讨论
高等数学里的概念和定义,为什么不能再简单些呢?
下一个讨论
除法的结果为什么被称为「商」?





© 2024-11-08 - tinynew.org. All Rights Reserved.
© 2024-11-08 - tinynew.org. 保留所有权利