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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 21:44:57