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


可以试试——

分享网址:




  

相关话题

  为什么学不懂基本不等式啊? 
  如何通过很多组相互包含的换算数据求解尽可能精确的换算比例? 
  16583是个特殊含义的数字么?还是网站的bug 
  《失控玩家》中的游戏有可能实现出来吗? 
  tkinter可以做出多复杂的界面? 
  为什么一个方程有复数解,数是一维的、二维的,还是?数学的性质特点是什么?数的维度是否暗示了能量的维度? 
  祈求代码不出 bug 该拜哪个神仙? 
  如何看待 Deepin 操作系统创始人王勇离职? 
  有没有大神回答一下,级数中,比值判别法中的ρ是指什么? 
  如何看待 9 月 24 日 Michael Atiyah 在海德堡获奖者论坛上对黎曼猜想的现场宣讲? 

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





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