R语言气球爆破范式仿真重复运行结果不一致求助
问题诊断与修复方案
核心问题分析
你的仿真结果不收敛、每次运行差异大,主要由三个原因导致:
- 未设置随机种子,每次运行生成的随机数序列完全不同,直接导致仿真结果无重现性
- 循环中反复用
rbind拼接数据框,不仅效率极低,还可能因内存分配波动引入微小差异 - 用
== max(...)选取最优值时,浮点精度误差或多个i值的平均收益接近最大值时,会随机选中其中一个
分步修复代码
1. 设置随机种子
在代码开头添加固定随机种子,确保每次运行生成完全相同的随机数序列,结果可重现。
2. 优化数据操作逻辑
放弃循环rbind,改用向量预分配存储结果,大幅提升效率的同时避免内存波动影响:
# 设置随机种子确保可重复性 set.seed(123) # -------------------- Short任务仿真 -------------------- OsimulationShort <- data.frame(timeEstimate = seq(1, 25, 0.5), averagePayout = NA_real_) for (idx in seq_along(OsimulationShort$timeEstimate)) { i2 <- OsimulationShort$timeEstimate[idx] # 一次性生成所有随机数,替代循环内重复生成 randNum2 <- runif(n=10000, min=3, max=7) + runif(n=10000, min=-1, max=1) # 向量化计算收益,避免逐行循环 reward2 <- ifelse(i2 > randNum2, 0, i2) OsimulationShort$averagePayout[idx] <- mean(reward2) } # 修正最优值选取:处理浮点精度误差,匹配所有接近最大值的结果 max_payout_short <- max(OsimulationShort$averagePayout) optimal_short <- data.frame( timeLongOrShort = "Short", distType = "Variability", riskCondition = "NO OVER", opTime = OsimulationShort$timeEstimate[OsimulationShort$averagePayout >= max_payout_short - 1e-8] ) optimal <- optimal_short # -------------------- Long任务仿真 -------------------- UsimulationLong <- data.frame(timeEstimate = seq(1, 25, 0.5), averagePayout = NA_real_) for (idx in seq_along(UsimulationLong$timeEstimate)) { i3 <- UsimulationLong$timeEstimate[idx] randNum3 <- runif(n=10000, min=9, max=21) + runif(n=10000, min=-3, max=3) reward3 <- ifelse(i3 < randNum3, 0, (2*randNum3) - i3) UsimulationLong$averagePayout[idx] <- mean(reward3) } max_payout_long <- max(UsimulationLong$averagePayout) optimal_long <- data.frame( timeLongOrShort = "Long", distType = "Variability", riskCondition = "NO UNDER", opTime = UsimulationLong$timeEstimate[UsimulationLong$averagePayout >= max_payout_long - 1e-8] ) optimal <- rbind(optimal, optimal_long)
3. 验证保守估计的预期
修改后运行代码,你会发现:
- Short任务的
randNum2分布均值为5,标准差约0.816,最优估计值会略低于5(符合保守预期) - Long任务的
randNum3分布均值为15,标准差约2.449,最优估计值会略高于15(符合保守预期) - 每次运行结果完全一致,收敛到稳定模式
额外建议
- 若需要测试不同随机场景,可通过修改种子值实现,无需重复调整代码
- 对于更大规模的仿真,可使用
data.table或dplyr进一步提升数据处理效率
内容的提问来源于stack exchange,提问作者Daxeon
相关产品推荐
相关产品推荐

