Kotlin中使用随机范围运算符时如何避免生成重复数字?
实现方案
核心逻辑是通过记录已返回的数值,避免重复返回。推荐采用「预生成乱序序列+按序取用」的方案,实现简单、性能稳定,天然避免重复值问题。
优化后的实现代码
class RandomImageLogic() { // 存储待返回的乱序数字队列 private val remainingNumbers = ArrayDeque<Int>() fun retrive(): Int { // 队列空时(所有数字已经返回过一轮),重新生成1-9的乱序序列填充队列 if (remainingNumbers.isEmpty()) { remainingNumbers.addAll((1..9).shuffled()) } // 取出队列第一个元素返回,同一轮内绝对不会重复 return remainingNumbers.removeFirst() } }
逻辑说明
- 第一次调用方法时才会生成乱序的1-9数字队列,避免不必要的性能消耗
- 每轮调用会依次从队列头部取数,同一轮内不会出现重复值,完全满足每次返回不同整数的需求
- 9个数字全部返回完毕后,下次调用会自动生成新的乱序序列,进入下一轮不重复返回,不需要手动重置
如果不需要自动重置,比如9个数字用完后不需要再返回新值,可以修改为返回可空类型:
// 无自动重置版本,数字全部返回后返回null class RandomImageLogic() { private val remainingNumbers = ArrayDeque<Int>((1..9).shuffled()) fun retrive(): Int? { return if (remainingNumbers.isNotEmpty()) remainingNumbers.removeFirst() else null } }
注:原代码中的方法名
retrive为拼写错误,正确拼写为retrieve,可按需修正。
内容的提问来源于stack exchange,提问作者Dumb Nerd
相关产品推荐
相关产品推荐

