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


可以试试——

分享网址:




  

相关话题

  为什么我认为程序员似乎大多不善言辞? 
  能否以数学为基石,写出一篇优质的科幻小说? 
  为什么使用C#开发软件的公司和程序员都很少? 
  这个数列问题困扰我一段时间,大佬有没有好的方法呢? 
  有人说 Java 程序员离开框架就什么都不是,如何看待这一言论? 
  为什么欧几里得在《几何原本》中的第四公设要设定所有的直角都相等? 
  现代科学领域,类似于魔角、鬼成像、上帝/天使/幽灵粒子的玄幻名词还有哪些? 
  10个人各自从1-10选数字,尽量让自己最大且不重复,如何选? 
  程序员行业有哪些越早知道越好的道理? 
  在日常生活中,数学真的能够帮到我们吗? 

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





© 2024-06-17 - tinynew.org. All Rights Reserved.
© 2024-06-17 - tinynew.org. 保留所有权利