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

R语言while循环生成条件随机数的代码错误排查与修正

R语言while循环练习问题排查

需求说明

练习目标是掌握R语言中while循环的用法,预设实现逻辑如下:

  • 步骤1:持续生成3个取值范围在0-100之间的均匀分布随机数,直到3个数字的总和大于150时停止生成
  • 步骤2:保存每轮最终符合停止条件的3个随机数,同时记录该轮停止前累计生成随机数的总次数
  • 步骤3:将上述单轮流程重复执行100轮

初始代码与异常

while循环初版代码

num_1_i = num_2_i = num_3_i = 0

list_results <- list()

for (i in 1:100)

{

while (num_1_i + num_2_i + num_3_i < 150) {


turn_i = i
num_1_i = runif(1,0,100)
num_2_i = runif(1,0,100)
num_3_i = runif(1,0,100)
break
}

inter_results_i <- data.frame(turn_i, num_1_i, num_2_i, num_3_i)

list_results[[i]] <- inter_results_i
   
}

运行后异常表现:100轮存储的结果数值完全一致,异常输出片段如下:

[[98]]
  turn_i  num_1_i num_2_i  num_3_i
1      1 87.67886 32.7703 52.72885

[[99]]
  turn_i  num_1_i num_2_i  num_3_i
1      1 87.67886 32.7703 52.72885

[[100]]
  turn_i  num_1_i num_2_i  num_3_i

repeat循环替代版代码

尝试用repeat循环重写后依然无法正常运行,代码如下:

list_results <- list()

for (i in 100) {
  repeat {
   

turn_i = i
num_1_i = runif(1,0,100)
num_2_i = runif(1,0,100)
num_3_i = runif(1,0,100)

    if(num_1_i + num_2_i + num_3_i < 150) break
  }
  results_tmp <- data.frame(turn = i, num_1 = num_1_i, num_2 = num_2_i, num_3 = num_3_i)
  
  list_results[[i]] <- results_tmp
}

代码错误点说明

  1. while版本错误
    • 随机数变量初始化在for循环外部:第一趟for循环跑完后,三个随机数的和已经大于150,后续99轮进入for循环时,while的判断条件直接不成立,不会进入循环生成新随机数,因此所有轮次都复用了第一次生成的数值
    • while循环内多余的break语句:生成一次随机数就强制跳出循环,完全没有实现“持续生成直到满足条件”的循环逻辑
    • 未设置计数变量,遗漏了“记录累计生成次数”的需求
  2. repeat版本错误
    • for循环写法错误:for (i in 100)只会让i取100这一个值,根本不会执行100轮循环
    • 跳出逻辑写反:当前判断条件是“三个数总和小于150就跳出”,和需求“总和大于150才停止”完全相反
    • 同样缺少累计生成次数的计数逻辑

修复后可运行代码

while循环正确实现

# 初始化结果存储列表
list_results <- list()

for (i in 1:100) {
  # 每轮开始前重置随机数变量、计数变量
  n1 <- n2 <- n3 <- 0
  gen_count <- 0
  
  # 总和不满足>150的条件就持续生成
  while (n1 + n2 + n3 <= 150) {
    n1 <- runif(1, 0, 100)
    n2 <- runif(1, 0, 100)
    n3 <- runif(1, 0, 100)
    gen_count <- gen_count + 1
  }
  
  # 存储本轮结果
  list_results[[i]] <- data.frame(
    turn = i,
    num1 = n1,
    num2 = n2,
    num3 = n3,
    total_gen_times = gen_count
  )
}

# 合并为数据框方便查看
final_df <- do.call(rbind, list_results)

repeat循环正确实现

list_results <- list()

for (i in 1:100) {
  n1 <- n2 <- n3 <- 0
  gen_count <- 0
  
  repeat {
    n1 <- runif(1, 0, 100)
    n2 <- runif(1, 0, 100)
    n3 <- runif(1, 0, 100)
    gen_count <- gen_count + 1
    # 满足总和>150的条件时跳出
    if (n1 + n2 + n3 > 150) break
  }
  
  list_results[[i]] <- data.frame(
    turn = i,
    num1 = n1,
    num2 = n2,
    num3 = n3,
    total_gen_times = gen_count
  )
}

final_df <- do.call(rbind, list_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.08.28 05:00:57