R语言实现每10次样本抽取后重置放回的模拟需求
解决方案:分阶段实现每10次无放回抽取后重置样本池
核心逻辑拆解
- 把100次抽取拆成10个独立阶段,每个阶段执行10次无放回抽取
- 每个阶段开始前重置样本池(放回所有样本,从完整的1-100集合重新抽取)
- 提前设置随机种子,保证模拟结果可复现
修正后的代码实现
# 设置随机种子,确保结果可复现 set.seed(123) # 初始化变量:总抽取次数计数器、存储所有抽取结果的向量 total_draws <- 0 all_results <- c() # 循环执行10个阶段(每个阶段10次抽取) for (stage in 1:10) { # 每个阶段开始时,初始化当前可用样本池 current_pool <- 1:100 # 每个阶段内执行10次无放回抽取 for (draw in 1:10) { # 从当前剩余样本池中随机抽取1个 selected <- sample(current_pool, 1, replace = FALSE) # 记录抽取结果 all_results <- c(all_results, selected) # 从样本池中移除已抽取的元素,实现无放回 current_pool <- current_pool[current_pool != selected] # 更新总抽取次数 total_draws <- total_draws + 1 # 替换原代码的判断逻辑(原代码中x是向量,直接判断>=1000无意义,这里针对单个抽取值判断) if (selected >= 1000) { cat("Seed", stage, "exceeded expectations\n") } } } # 输出结果 print(all_results) cat("Total draws completed:", total_draws, "\n")
代码说明
- 随机种子控制:用
set.seed()固定种子,每次运行都会得到完全一致的抽取序列 - 分阶段重置:外层循环控制10个阶段,每个阶段重新初始化样本池,实现“所有样本放回”的要求
- 无放回逻辑:内层循环每次抽取后从样本池中移除对应元素,保证同阶段内不会重复抽取
- 终止条件:通过固定循环次数(10阶段×10次)自动终止,替代原代码的无限循环
简化写法(批量抽取)
如果不需要逐次跟踪样本池状态,也可以每个阶段直接批量抽取10个无放回样本,代码更高效:
set.seed(123) all_results <- c() for (stage in 1:10) { # 每个阶段一次性抽取10个无放回样本 stage_draws <- sample(1:100, 10, replace = FALSE) all_results <- c(all_results, stage_draws) # 检查当前阶段是否有样本符合条件 if (any(stage_draws >= 1000)) { cat("Seed", stage, "exceeded expectations\n") } } print(all_results) cat("Total draws completed:", length(all_results), "\n")
内容的提问来源于stack exchange,提问作者htii
相关产品推荐
相关产品推荐

