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

无需手动枚举,如何自动计算硬币翻转序列的条件概率?

自动生成H/T序列并计算条件概率的R实现

1. 自动生成所有长度1-5的H/T序列

无需手动枚举,用R的expand.grid配合循环可快速生成所有可能的序列。每个长度为k的序列有2^k种组合,代码如下:

# 生成长度1到5的所有H/T序列
all_patterns <- c()
for (k in 1:5) {
  # 生成k个位置的所有H/T组合
  combos <- expand.grid(rep(list(c("H", "T")), k), stringsAsFactors = FALSE)
  # 将每行字符拼接为完整序列
  patterns <- apply(combos, 1, paste, collapse = "")
  all_patterns <- c(all_patterns, patterns)
}

2. 处理硬币翻转数据并统计条件概率

假设你的硬币翻转数据是字符向量(例如flips <- sample(c("H", "T"), 100, replace = TRUE)),以下函数可自动统计每个模式的出现次数、后续H/T的条件概率:

calc_pattern_probs <- function(flips, patterns) {
  # 初始化结果表格
  result <- data.frame(
    Pattern = character(),
    Total_Count = integer(),
    P_H_given_Pattern = numeric(),
    P_T_given_Pattern = numeric(),
    stringsAsFactors = FALSE
  )
  
  for (pattern in patterns) {
    k <- nchar(pattern)
    n_flips <- length(flips)
    if (k >= n_flips) {
      # 模式长度超过翻转次数,直接跳过
      result <- rbind(result, data.frame(
        Pattern = pattern,
        Total_Count = 0,
        P_H_given_Pattern = NA,
        P_T_given_Pattern = NA,
        stringsAsFactors = FALSE
      ))
      next
    }
    
    # 提取所有长度为k的滑动窗口序列
    window_patterns <- sapply(1:(n_flips - k), function(i) {
      paste(flips[i:(i + k - 1)], collapse = "")
    })
    # 提取每个窗口后的下一个结果
    next_outcomes <- flips[(k + 1):n_flips]
    
    # 统计当前模式的总出现次数
    total <- sum(window_patterns == pattern)
    if (total == 0) {
      # 模式未出现,概率设为NA
      ph <- NA
      pt <- NA
    } else {
      # 统计后续出现H和T的次数
      h_count <- sum(next_outcomes[window_patterns == pattern] == "H")
      t_count <- sum(next_outcomes[window_patterns == pattern] == "T")
      ph <- h_count / total
      pt <- t_count / total
    }
    
    # 添加到结果表格
    result <- rbind(result, data.frame(
      Pattern = pattern,
      Total_Count = total,
      P_H_given_Pattern = round(ph, 3),
      P_T_given_Pattern = round(pt, 3),
      stringsAsFactors = FALSE
    ))
  }
  
  return(result)
}

3. 运行并生成格式化表格

用你的硬币翻转数据调用函数,再通过knitr::kable生成美观表格:

# 示例:生成100次硬币翻转数据(固定种子方便复现)
set.seed(123)
flips <- sample(c("H", "T"), 100, replace = TRUE)

# 计算所有模式的概率
pattern_probs <- calc_pattern_probs(flips, all_patterns)

# 生成格式化表格(需先安装knitr包)
library(knitr)
kable(pattern_probs, caption = "各H/T序列的条件概率及出现次数")

说明

  • 代码自动覆盖长度1到5的所有可能序列,无需手动录入
  • 未出现的模式总次数标记为0,条件概率设为NA
  • 结果表格包含模式、总出现次数、P(H|Pattern)、P(T|Pattern)四列,结构清晰

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:53:18