谢邀.
我将题主的问题编辑、整理了一下,希望符合出题人的原意:
问:
整个游戏只有一位玩家,有 1~9 九张牌,掷俩骰子并设点数之和为 n,此时有两种出牌的策略: 一是出点数为 n 的牌;二是出两张点数之和为 n 的牌. 将九张牌全部打出算赢,求赢的概率?
例:
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%
可以试试——
分享网址: