R语言修改抛硬币模拟代码统计首次出现HTH序列所需次数
R代码实现方案
核心模拟代码
以下代码完全匹配你的需求,不需要手动重复模拟、合并数据或导入Excel计算,全程自动执行:
# 定义单次模拟函数:返回首次出现HTH序列的run编号 simulate_single <- function() { run_count <- 0 # 无限循环直到命中HTH序列自动停止 while(TRUE) { run_count <- run_count + 1 # 单次run:抛3次硬币,概率和你设定一致 tosses <- sample(c("H", "T"), size = 3, replace = TRUE, prob = c(0.05, 0.95)) # 判断当前run的结果是否为HTH序列 if (identical(tosses, c("H", "T", "H"))) { return(run_count) } } } # 设置随机种子保证结果可复现,不需要可以删掉这行 set.seed(123) # 重复执行100次模拟,自动汇总所有结果 n_sim <- 100 run_results <- replicate(n_sim, simulate_single()) # 计算总抛币次数(每个run对应3次抛币) toss_results <- run_results * 3
结果统计
直接调用基础函数即可得到你需要的三个指标:
# 1. 观测到HTH序列前最少抛币次数 min_toss <- min(toss_results) # 2. 观测到HTH序列前平均抛币次数 mean_toss <- mean(toss_results) # 3. 观测到HTH序列前最多抛币次数 max_toss <- max(toss_results) # 打印结果 cat("最少抛币次数:", min_toss, "\n") cat("平均抛币次数:", round(mean_toss, 2), "\n") cat("最多抛币次数:", max_toss, "\n")
可视化绘制
基础直方图(和你提供的示例逻辑完全一致)
hist(run_results, main = "Number of Runs before HTH", xlab = "Run编号", col = "lightblue", border = "white")
ggplot2版本直方图
library(ggplot2) ggplot(data.frame(run_num = run_results), aes(x = run_num)) + geom_histogram(fill = "steelblue", alpha = 0.7, bins = 15) + labs(title = "首次出现HTH序列所需Run数分布", x = "Run编号", y = "频数") + theme_minimal()
可选逻辑调整:如果你需要判定跨run的连续三次抛币也属于命中(即不按独立run判断,只要全局出现连续三次HTH就停止),可以替换单次模拟函数为以下版本,直接返回总抛币次数,不需要额外乘3:
simulate_single_continuous <- function() { all_tosses <- c() while(TRUE) { all_tosses <- c(all_tosses, sample(c("H", "T"), size = 1, prob = c(0.05, 0.95))) if (length(all_tosses) >=3 && identical(tail(all_tosses, 3), c("H","T","H"))) { return(length(all_tosses)) } } }
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

