You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:57:03