百科问答小站 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%


可以试试——

分享网址:




  

相关话题

  1³+2³+3³+......+n³=多少? 
  在你不能证明e+π是无理数之前,有人问你这是有理数还是无理数,你选什么(看补充)? 
  如何理解矩阵相乘的几何意义或现实意义? 
  数列收敛的 ε-N 定义怎么理解?其作用是什么? 
  十赌九输这句话有根据吗? 
  《图灵传》中讲到「狄拉克基于抽象数学预言了正电子的存在」,其中细节为何? 
  如何看待许小年所说的「中国已处于中等收入陷阱」,该陷阱是房地产行业的魔咒吗? 
  为什么很多程序员不用switch,而是大量的if……else if? 
  数学符号是不是在一定程度上阻碍了数学的发展? 
  有哪些用普通人的知识水平就可以巧妙证明的数学难题? 

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





© 2024-05-14 - tinynew.org. All Rights Reserved.
© 2024-05-14 - tinynew.org. 保留所有权利