R语言使用while循环按条件终止随机数生成的报错修复问题
问题原因
- 逻辑倒置:while循环条件写反,当前代码逻辑为「当a和b都大于10时才生成新随机数」,正确逻辑应为「当a和b未满足要求时,持续生成新随机数」
- 条件格式错误:
d_i$a > 10 & d_i$b >10返回的是和样本量长度一致的布尔向量,而while循环仅能接收单个布尔值,需要用all()或any()将向量聚合为单个判断结果 - 变量未初始化:首次进入while循环时
d_i未定义,会直接跳过循环,导致结果列表全为空值,最终合并出空表
修正方案
首先明确你的需求场景,对应选择代码:
场景1:每次迭代生成一批1000个随机数对,直到整批所有数对都满足a>10且b>10
注意:该场景下满足条件的概率极低(正态分布N(10,1)单值大于10的概率为50%,1000对都满足的概率为0.25^1000),几乎无法运行出结果,仅做逻辑修正参考
results <- list() for (i in 1:10){ # 初始化d_i,保证首次判断正常执行 d_i <- data.frame(a = rnorm(1000,10,1), b = rnorm(1000,10,1)) # 当整批数据未全部满足条件时,持续重新生成 while (!all(d_i$a > 10 & d_i$b > 10)) { a = rnorm(1000,10,1) b = rnorm(1000,10,1) d_i = data.frame(a,b) } d_i$index = 1:nrow(d_i) d_i$iteration = as.factor(i) results[[i]] <- d_i } results_df <- do.call(rbind.data.frame, results)
场景2:每次迭代凑够1000个满足a>10且b>10的随机数对(更符合实际使用需求)
results <- list() for (i in 1:10){ valid_pairs <- list() count <- 0 # 凑够1000个有效数对后停止循环 while (count < 1000) { a <- rnorm(1,10,1) b <- rnorm(1,10,1) if (a > 10 & b > 10) { count <- count + 1 valid_pairs[[count]] <- data.frame(a = a, b = b) } } d_i <- do.call(rbind, valid_pairs) d_i$index = 1:nrow(d_i) d_i$iteration = as.factor(i) results[[i]] <- d_i } results_df <- do.call(rbind.data.frame, results)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

