如何修正循环存储递增随机数时的max函数警告?
解决while循环生成递增随机值的警告问题
问题分析
你遇到的警告是因为第一次循环时list_results是空列表:执行max(unlist(list_results))时,unlist()返回空向量,max()没有非缺失参数可计算,因此抛出警告并返回-Inf。虽然这不影响最终结果(第一个生成的随机数必然大于-Inf),但可以通过调整代码消除警告,同时大幅提升运行效率。
优化方案
方案1:先初始化第一个元素,避免空列表判断
先手动生成第一个值存入列表,后续循环直接基于列表最后一个元素的数值做判断,无需每次unlist整个列表(原代码10万次循环会反复拆解列表,性能极差):
library(dplyr) list_results <- list() # 初始化第一个元素 first_num <- rnorm(1, 100, 10) list_results[[1]] <- data.frame(i = 1, num_1_i = first_num) # 从第2次循环开始 for (i in 2:100000) { num_1_i <- rnorm(1, 100, 10) # 直接取最后一个元素的数值做比较,无需unlist整个列表 while (num_1_i <= list_results[[i-1]]$num_1_i) { num_1_i <- rnorm(1, 100, 10) } list_results[[i]] <- data.frame(i = i, num_1_i = num_1_i) }
方案2:用变量记录当前最大值(性能最优)
维护一个单独的变量存储当前的最大值,不用每次操作列表,计算效率最高:
library(dplyr) list_results <- list() current_max <- -Inf # 初始化最大值为负无穷 for (i in 1:100000) { num_1_i <- rnorm(1, 100, 10) while (num_1_i <= current_max) { num_1_i <- rnorm(1, 100, 10) } current_max <- num_1_i # 更新最大值 list_results[[i]] <- data.frame(i = i, num_1_i = num_1_i) }
额外说明
- 方案2的效率远高于原代码:原代码每次循环都要
unlist整个列表,10万次循环会产生大量不必要的计算;而方案2只需要维护一个变量,每次比较和更新都是O(1)操作。 - 两种方案都能彻底消除你遇到的警告,同时保证生成的数值严格递增。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

