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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:45:03