R语言实现洗牌堆发牌至出现首个对子的10000次模拟问题
扑克牌首次出现对子的发牌模拟实现(R语言)
我们需要实现的核心逻辑:从洗匀的52张标准牌堆逐张发牌,编写函数接收洗牌后牌堆作为入参,返回首次出现对子(两张牌面值相同)时已发牌的总数量,最终完成10000次发牌过程的模拟。
已完成的基础工具函数
发牌函数
deal <- function() { # 从当前牌堆顶部取出一张牌 card <-deck[1, ] assign("deck", deck[-1, ], envir = globalenv()) return(card) } deal()
该函数从全局环境存储的当前牌堆deck中取出第一张牌返回,同时将全局环境中的deck更新为剩余未发的牌。
洗牌函数
shuffle <- function() { shuffle_idx <- sample(seq_len(52), size = 52) assign("deck", deck_orginal[shuffle_idx, ], envir = globalenv()) } shuffle()
deck_orginal为预定义的完整52张标准牌堆原始对象,该函数会随机打乱原始牌堆顺序,生成新的洗匀牌堆更新到全局环境的deck变量中。
核心逻辑实现
计算首次出现对子时的发牌数量函数
get_first_pair_num <- function(shuffled_deck) { # 存储已发牌的面值,默认牌堆对象的rank列存储面值 dealt_ranks <- c() for (i in 1:nrow(shuffled_deck)) { current_rank <- shuffled_deck$rank[i] # 判断当前面值是否已出现过 if (current_rank %in% dealt_ranks) { return(i) } dealt_ranks <- c(dealt_ranks, current_rank) } # 标准52张牌最多14张无对子,该分支为极端容错逻辑,正常不会触发 return(52) }
10000次模拟实现
# 预存储模拟结果 sim_res <- c() sim_times <- 10000 for (j in 1:sim_times) { # 每次模拟前重新洗牌 shuffle() # 计算当前局首次出现对子的发牌数 current_num <- get_first_pair_num(deck) sim_res <- c(sim_res, current_num) } # 可按需输出统计结果,示例为平均首次出现对子的发牌数 mean(sim_res)
内容的提问来源于stack exchange,提问作者2manynmaestaken
相关产品推荐
相关产品推荐

