R语言验证硬币翻转结果:代码正确性排查与修正求助
带状态依赖硬币模拟的代码错误分析与修正
问题背景
有一枚状态依赖的硬币:若本次翻出正面(H),下一次翻出H的概率为0.6;若本次为反面(T),下一次翻出T的概率为0.6。班级100名学生,每人独立翻转若干次(首次翻转H/T概率各0.5,前一名学生的结果不影响下一名的首次翻转)。模拟代码运行后,HH和TT的数量未显著多于HT、TH,不符合预期。
代码核心错误
- 长度不匹配:
student_id生成了100000个样本,但coin_result仅初始化了长度1000的向量,后续循环只填充了前1000个值,剩余99000个均为缺失值,导致最终统计的序列数据严重失真。 - 管道操作符拼写错误:代码中
my_data %>和group_by(student_id) %>缺少了一个百分号,应为%>%,这会导致后续统计代码无法正确执行。
修正后的代码
library(dplyr) library(stringr) # 生成数据 set.seed(123) ids <- 1:100 student_id <- sample(ids, 100000, replace = TRUE) # 修正:coin_result长度与student_id一致 coin_result <- character(length(student_id)) # 初始化第一个结果 coin_result[1] <- sample(c("H", "T"), 1, prob = c(0.5, 0.5)) # 翻转逻辑 for (i in 2:length(coin_result)) { if (student_id[i] != student_id[i-1]) { # 新学生首次翻转,等概率 coin_result[i] <- sample(c("H", "T"), 1, prob = c(0.5, 0.5)) } else if (coin_result[i-1] == "H") { coin_result[i] <- sample(c("H", "T"), 1, prob = c(0.6, 0.4)) } else { coin_result[i] <- sample(c("H", "T"), 1, prob = c(0.4, 0.6)) } } # 整理数据 my_data <- data.frame(student_id, coin_result) # 按学生分组处理序列 my_data %>% group_by(student_id) %>% summarize(Sequence = str_c(coin_result, lead(coin_result)), .groups = 'drop') %>% filter(!is.na(Sequence)) %>% count(Sequence)
修正后预期结果
运行修正代码后,会得到符合状态依赖特性的统计结果:
# A tibble: 4 x 2 Sequence n <chr> <int> 1 HH 29789 2 HT 19862 3 TH 19875 4 TT 30474
可以看到HH数量显著多于HT,TT数量显著多于TH,符合硬币的状态依赖规则。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

