用r语言,编写以下程序,从一副 52 张扑克牌中,请分别求出炸弹、顺子(5 张)、同花顺(3 张)的概率。
时间: 2023-06-10 09:06:09 浏览: 287
发牌求同花顺概率.cpp
以下是用 R 语言编写程序,从一副 52 张扑克牌中求出炸弹、顺子(5 张)、同花顺(3 张)的概率:
```r
# 创建一副扑克牌,共 52 张牌
cards <- c("2H", "3H", "4H", "5H", "6H", "7H", "8H", "9H", "10H", "JH", "QH", "KH", "AH",
"2D", "3D", "4D", "5D", "6D", "7D", "8D", "9D", "10D", "JD", "QD", "KD", "AD",
"2C", "3C", "4C", "5C", "6C", "7C", "8C", "9C", "10C", "JC", "QC", "KC", "AC",
"2S", "3S", "4S", "5S", "6S", "7S", "8S", "9S", "10S", "JS", "QS", "KS", "AS")
# 定义函数,判断是否为同花顺(3 张)
is_flush_straight <- function(hand) {
suit <- substr(hand, 2, 2) # 获取花色
ranks <- sort(as.numeric(substring(hand, 1, 1))) # 获取点数,并排序
if (length(unique(suit)) == 1) { # 判断是否为同花
if (all(diff(ranks) == 1) && length(ranks) == 3) { # 判断是否为顺子
return(TRUE) # 返回是同花顺
}
}
return(FALSE) # 返回不是同花顺
}
# 定义函数,判断是否为顺子(5 张)
is_straight <- function(hand) {
ranks <- sort(as.numeric(substring(hand, 1, 1))) # 获取点数,并排序
if (all(diff(ranks) == 1) && length(ranks) == 5) { # 判断是否为顺子
return(TRUE) # 返回是顺子
}
return(FALSE) # 返回不是顺子
}
# 定义函数,判断是否为炸弹
is_bomb <- function(hand) {
ranks <- as.numeric(substring(hand, 1, 1)) # 获取点数
if (length(unique(ranks)) == 1) { # 判断是否为炸弹
return(TRUE) # 返回是炸弹
}
return(FALSE) # 返回不是炸弹
}
# 模拟抽牌过程,重复 10000 次
n <- 10000
results <- replicate(n, {
sample_cards <- sample(cards, 5) # 随机抽取 5 张牌
if (is_bomb(sample_cards)) { # 判断是否为炸弹
return("炸弹")
}
if (is_flush_straight(sample_cards)) { # 判断是否为同花顺
return("同花顺")
}
if (is_straight(sample_cards)) { # 判断是否为顺子
return("顺子")
}
return(NULL) # 不是炸弹、同花顺、顺子,返回 NULL
})
# 计算炸弹、顺子、同花顺的概率
bomb_prob <- sum(results == "炸弹") / n
straight_prob <- sum(results == "顺子") / n
flush_straight_prob <- sum(results == "同花顺") / n
# 输出结果
cat("炸弹的概率为:", bomb_prob, "\n")
cat("顺子的概率为:", straight_prob, "\n")
cat("同花顺的概率为:", flush_straight_prob, "\n")
```
结果可能会有所不同,但通常情况下,炸弹的概率较低,顺子的概率中等,同花顺的概率较低。
阅读全文