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

R语言验证硬币翻转结果:代码正确性排查与修正求助

带状态依赖硬币模拟的代码错误分析与修正

问题背景

有一枚状态依赖的硬币:若本次翻出正面(H),下一次翻出H的概率为0.6;若本次为反面(T),下一次翻出T的概率为0.6。班级100名学生,每人独立翻转若干次(首次翻转H/T概率各0.5,前一名学生的结果不影响下一名的首次翻转)。模拟代码运行后,HH和TT的数量未显著多于HT、TH,不符合预期。

代码核心错误

  1. 长度不匹配:student_id生成了100000个样本,但coin_result仅初始化了长度1000的向量,后续循环只填充了前1000个值,剩余99000个均为缺失值,导致最终统计的序列数据严重失真。
  2. 管道操作符拼写错误:代码中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:02:28