程序介绍(Part A)
斗地主中有时候会发现自己某一张牌没有,比如J一张都没抓到,下面使用R语言生成随机数,模拟计算如果自己J一张都没抓到的情况下,其他两人抓到J炸的概率为0.104
iterSum = 1000000 #总实验次数
countlostOneCard = rep(0,14)
countBomb = rep(0,14)
puke<- c(rep(1:13,4),"A","B")#1-13对应A,2,3,4..J,Q,K;A和B对应大小王
tmp <- c()
for(iter in 1:iterSum){
player1.index<- sample(1:54,size=18,replace=FALSE)
player1 <- puke[player1.index]
otherpuke<- puke[!1:length(puke) %in% player1.index]
player2.index<- sample(1:36,size=18,replace=FALSE)
player2 <- otherpuke[player2.index]
player3<- otherpuke[!1:length(otherpuke) %in% player2.index]
#以上为随机发牌
countLost <- c()
for(i in seq(1:13)){
countLost <- c(countLost,i %in% player1)#查看是否缺一张牌,即是否缺A,2,3,4..J,Q,K;
}
for(k in 0:13){
if(sum(countLost)==(13-k)){#如果缺k张牌
countlostOneCard[k+1] = countlostOneCard[k+1] + 1
BombFlag = FALSE #以下查看对方两家是否有炸弹(不包括王炸)
for(j in seq(1:13)){
if(sum(j == player2)==4){# || ("A" %in% player2 && "B" %in% player2
BombFlag = TRUE
}
if(sum(j == player3)==4){# || ("A" %in% player3 && "B" %in% player3
BombFlag = TRUE
}
}
if(BombFlag){
countBomb[k+1] = countBomb[k+1] + 1
}
}
}
}
# print("依次输出自己缺k张牌的概率")
print(countlostOneCard/iterSum)
# print("在自己缺k张牌的时候,其他两人有炸弹的概率")
print(countBomb/countlostOneCard)
# 结论
# 大致可以计算出,如果某个人没拿到某张牌,例如9,剩下两个人中某个人在这里拿到9炸的概率为0.125
# 但是,因为每个人都拿18张牌,总拿到的牌数是一样的,如果剩下两个人在这里拿了9炸(同时拿了4张),牌数(0,4)(4,0)
# 总牌数一致导致拿牌数比计算出来的0.125要小
# 程序运行出来,剩下两人出王炸的概率是0.104
运行结果(Part A)
> # print("依次输出自己缺k张牌的概率")
> print(countlostOneCard/iterSum)
[1] 0.023521 0.161637 0.354045 0.315890 0.123036 0.020506 0.001338 0.000027 0.000000 0.000000 0.000000
[12] 0.000000 0.000000 0.000000
> # print("在自己缺k张牌的时候,其他两人有炸弹的概率")
> print(countBomb/countlostOneCard)
[1] 0.0000000 0.1038809 0.1961643 0.2780272 0.3526122 0.4207549 0.4633782 0.4444444 NaN NaN
[11] NaN NaN NaN NaN
程序介绍(Part B)
斗地主中有时候会发现自己一张鬼牌都没有,下面使用R语言生成随机数,模拟计算如果自己一张鬼牌都没有的情况下,其他两人抓到王炸的概率为0.48
iterSum = 10000
countlostOneCard = 0
countBomb = 0
puke<- c(rep(1:13,4),"A","B")
tmp <- c()
for(iter in 1:iterSum){
player1.index<- sample(1:54,size=18,replace=FALSE)
player1 <- puke[player1.index]
otherpuke<- puke[!1:length(puke) %in% player1.index]
player2.index<- sample(1:36,size=18,replace=FALSE)
player2 <- otherpuke[player2.index]
player3<- otherpuke[!1:length(otherpuke) %in% player2.index]
if(!"A" %in% player1 && !"B" %in% player1){
countlostOneCard = countlostOneCard + 1
BombFlag = FALSE
if("A" %in% player2 && "B" %in% player2){
BombFlag = TRUE
}
if("A" %in% player3 && "B" %in% player3){
BombFlag = TRUE
}
if(BombFlag){
countBomb = countBomb + 1
}
}
}
# print("依次输出自己缺小丑牌的概率")
print(countlostOneCard/iterSum)
# print("在自己缺小丑牌的时候,其他两人有王炸的概率")
print(countBomb/countlostOneCard)
# 结论
# 大致可以计算出,如果某个人没拿到"A"和"B",剩下两个人中某个人在这里拿了王炸(同时拿了两张)的概率为0.5
# 但是,因为每个人都拿18张牌,总拿到的牌数是一样的,如果剩下两个人在这里拿了王炸(同时拿了两张),牌数(0,2)(2,0)
# 这样的概率会比剩下两个人在这里各自拿了一张王(1,1)的概率要小
# 程序运行出来,剩下两人出王炸的概率是0.48
运行结果
> # print("依次输出自己缺小丑牌的概率")
> print(countlostOneCard/iterSum)
[1] 0.438
> # print("在自己缺小丑牌的时候,其他两人有王炸的概率")
> print(countBomb/countlostOneCard)
[1] 0.4803653
Further
程序还有些许不足的地方,在于发牌的时候,地主应该是比另外两人多3张牌,这点模拟的时候没有考虑到。
也没有进行概率的置信度的计算。