在Kotlin中如何生成两个随机数且第二个不与第一个值重复
实现方案
方案1:适用于仅需2个不重复值的场景
有两种常用写法,效果完全一致:
写法A:过滤取值范围
直接从1-69的范围中排除已选中的第一个值,再取随机数,写法直观易读:
val firstNumber = (1..69).random() val secondNumber = (1..69).filterNot { it == firstNumber }.random()
写法B:重复取值直到不重复
如果不想做集合过滤,也可以用循环重试,在当前取值范围很小的场景下性能差异可以忽略:
val firstNumber = (1..69).random() var secondNumber: Int do { secondNumber = (1..69).random() } while (secondNumber == firstNumber)
方案2:适用于需要生成3个及以上不重复值的场景
如果后续还要取出更多不重复的随机数,提前对范围做乱序处理效率更高,不用每次做过滤或重试:
// 生成1-69的乱序列表,所有元素天然不重复 val shuffledPool = (1..69).shuffled() val firstNumber = shuffledPool[0] val secondNumber = shuffledPool[1] // 后续需要第N个不重复值,直接取shuffledPool[N-1]即可
补充说明
- 以上所有方案都保证两个随机数取值都在1-69范围内,且不会重复
- 原代码中的变量名使用了复数形式
firstNumbers/secondNumbers,但实际存储的是单个Int值,建议调整为单数形式,更符合Kotlin编码规范,可读性更好
内容的提问来源于stack exchange,提问作者Jerry Applegarth
相关产品推荐
相关产品推荐

