如何在R语言双for循环的骰子模拟器中存储sim输出?
解决骰子模拟器的结果存储问题
你的问题在于每次循环都会用新的sim覆盖之前的结果,所以没法保留所有模拟数据。最适合的存储方式是嵌套列表——因为不同样本量(20/50/100)的结果长度不同,列表可以灵活容纳不同结构的数据。
修改后的代码如下:
dice <- matrix(c(1,2,3,4,5,6),1,6) # 初始化嵌套列表:外层对应不同的N,内层对应10次模拟 sim_results <- list() n_values <- c(20,50,100) for (idx in seq_along(n_values)) { N <- n_values[idx] # 为当前N创建子列表,存储10次模拟结果 sim_results[[idx]] <- list() for (i in 1:10) { sim <- sample(dice, size = N, replace = TRUE) # 将本次模拟结果存入子列表对应位置 sim_results[[idx]][[i]] <- sim } } # 给外层列表命名,方便后续访问 names(sim_results) <- paste0("N_", n_values)
如何访问存储的结果
- 查看样本量为20的所有模拟结果:
sim_results$N_20 - 查看样本量为50的第3次模拟结果:
sim_results$N_50[[3]] - 计算每组模拟的均值(对应你初始化的
sim_mean):
sim_mean <- lapply(sim_results, function(x) sapply(x, mean)) # 输出每个N对应的10次模拟均值 print(sim_mean)
如果不想用嵌套列表,也可以用扁平列表存储所有30次模拟,只需初始化一个长度为30的列表,用计数器跟踪位置:
flat_results <- vector("list", length = 3*10) counter <- 1 for (N in c(20,50,100)) { for (i in 1:10) { sim <- sample(dice, size = N, replace = TRUE) flat_results[[counter]] <- sim counter <- counter + 1 } }
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

