使用while循环编写R图书模拟函数:计算进程停止时间及排查代码错误
R语言图书模拟函数问题修复方案
原代码核心错误
- 入参
y被函数内部第一行的y = 0覆盖,所有后续基于y的计算逻辑全部失效 - 生成shelves向量时,若传入的
y小于等于3,rep(0, y-3)会因为长度为负直接抛出错误 - while循环判断条件
shelves != 0返回逻辑向量,仅当shelves所有元素都不为0时才会进入循环,和预期模拟逻辑不符 - 循环内部无任何状态更新、终止判断逻辑,也没有计时相关代码,要么直接不运行要么陷入死循环
耗时计算实现逻辑
R中统计代码运行耗时可以调用Sys.time()函数,在循环启动前记录起始时间,循环终止后用结束时间减去起始时间,即可得到进程从运行到停止的总耗时。
修正后可运行代码
以下代码默认按照「每次随机抽取一本书,抽到动物书(值为1)时终止运行」的模拟逻辑实现,你可以根据实际需求调整循环内的规则:
# y = 总图书数量,必须大于3 sim_books <- function (y) { # 校验入参合法性 if(y <= 3){ stop("总图书数量y必须大于3") } # 生成书架向量:y-3本植物书(值为0),1本动物书(值为1) shelves <- c(rep(0, y - 3), 1) plant_books <- y-3 animal_books <- 1 # 记录循环开始时间 start_time <- Sys.time() # 循环逻辑:随机抽书,抽到动物书停止 while (TRUE) { # 随机抽取一本书的索引 pick_idx <- sample(1:length(shelves), 1) picked_book <- shelves[pick_idx] # 判断是否抽到动物书 if(picked_book == 1){ break } } # 计算总耗时 time_stop <- Sys.time() - start_time return(time_stop) } # 测试调用:总图书数量为10 sim_books(10)
内容的提问来源于stack exchange,提问作者pyul
相关产品推荐
相关产品推荐

