R语言生成无连续重复随机数 满足零件寿命测试目的地序列需求
问题核心错误点
- 逻辑倒置:原代码if判断相邻值相等时直接保留重复值,不等时才重新生成,与需求完全相反
- 随机数范围错误:
runif(1, min=1, max=10)的取值区间为左闭右开,floor处理后最多只能得到9,无法生成10这个目的地值 - 无重复重试机制:单次重新生成仍有可能得到重复值,没有循环校验直到生成合法值
- 冗余代码:R的for循环会自动遍历给定序列的所有值,手动写
i <- i +1不会改变循环变量取值,属于无效代码
修正后完整代码
# 可直接将测试值50改为实际需要的15000次 iterations <- 50 LSVmin <- 1 LSVmax <- 10 # 初始化存储序列的向量,用vector比matrix更适合单维数据 movementV <- vector(length = iterations) # 初始第一个目的地设为10,可根据需求修改 movementV[1] <- 10 for (i in 2:iterations) { # 预生成第一个随机值 new_pos <- floor(runif(1, min = LSVmin, max = LSVmax + 1)) # 只要新值和上一个值相等,就重新生成 while (new_pos == movementV[i-1]) { new_pos <- floor(runif(1, min = LSVmin, max = LSVmax + 1)) } # 确认不重复后赋值 movementV[i] <- new_pos }
代码逻辑说明
- 调整了随机数生成的max参数为
LSVmax + 1,保证floor处理后可以覆盖1到10的所有目的地值 - 新增while循环做重复校验:每次生成新值后和上一个位置的目的地比对,只要重复就持续重新生成,直到得到不重复的合法值再赋值,从根源上避免相邻重复
- 改用vector存储序列,相比matrix更适合单维的移动序列场景,后续导出到电机控制程序也更方便
内容的提问来源于stack exchange,提问作者jeffbraveheartgroup
相关产品推荐
相关产品推荐

