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

