请求修正R语言多硬币首次正面计数错误的代码
修正R语言硬币实验的首次正面计数错误
你的计数错误核心问题是:每次迭代时错误覆盖了硬币已记录的首次正面次数——后续翻转操作不管硬币是否已经出过正面,都更新次数,导致第一次出现正面的迭代次数被后期数值覆盖。
以下是修正后的代码,关键逻辑是仅在硬币首次出现正面时记录当前迭代次数,避免后续操作覆盖:
set.seed(123) # 设置随机种子,方便复现结果 n_coins <- 10 # 初始化硬币状态:-1=未被选中,0=反面,1=正面 coin_states <- rep(-1, n_coins) # 初始化首次正面次数向量,NA表示尚未记录 first_head <- rep(NA, n_coins) iteration <- 0 # 循环直到所有硬币都至少出现过一次正面 while(any(coin_states != 1)) { iteration <- iteration + 1 # 随机生成本次要选取的硬币数量(0到10之间的整数) k <- sample(0:n_coins, 1) if(k > 0) { # 无放回随机选取k枚硬币的索引 selected_idx <- sample(1:n_coins, k, replace = FALSE) # 对选中的硬币进行翻转,生成0(反面)或1(正面) flipped_results <- sample(c(0, 1), k, replace = TRUE) # 更新选中硬币的状态 coin_states[selected_idx] <- flipped_results # 仅更新那些首次出现正面的硬币的次数:之前未记录(NA)且本次翻转为1 update_mask <- is.na(first_head[selected_idx]) & flipped_results == 1 first_head[selected_idx[update_mask]] <- iteration } } # 输出结果 cat("各硬币首次正面所需翻转次数:\n") print(first_head) cat("实验总迭代次数:", iteration, "\n")
关键修正说明
- 单独维护
first_head向量,初始值为NA,仅当硬币第一次翻转为正面时,才将当前迭代次数赋值给对应位置,彻底避免后续翻转操作覆盖首次记录。 - 通过
update_mask精准筛选需要更新的硬币索引,确保只有符合条件的硬币才会被记录首次正面次数。
运行上述代码后,你会看到每个硬币的首次正面次数会正确对应其第一次出现1的迭代轮次,不会再出现后期数值覆盖前期正确记录的问题。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

