Прежде всего, я бы не рекомендовал использовать для этого функцию, лучше использовать класс, который инкапсулирует логику, которая повышает удобство использования.
1-й вариант
Вы можетеиспользуйте функцию List
(да, это действительно функция здесь), чтобы сгенерировать список всех возможных чисел, затем перемешать его и после этого выполнить итерацию по нему.
class UniqueRandomNumbers(lowerBound: Int, upperBound: Int) {
private val iterator = List(upperBound - lowerBound) {
lowerBound + it + 1
}.shuffled().iterator()
val next get() = if (iterator.hasNext()) iterator.next() else null
}
2-й вариант
В качестве альтернативы вы можете генерировать случайные числа, пока не найдете тот, который не был использован ранее.
class UniqueRandomNumbers(val lowerBound: Int, val upperBound: Int) {
private val consumedNumbers = mutableSetOf<Int>()
val next: Int?
get() {
var newNumber: Int
if (consumedNumbers.size == (upperBound - lowerBound + 1)) {
return null
}
do {
newNumber = Random.nextInt(lowerBound, upperBound + 1)
} while (newNumber in consumedNumbers)
consumedNumbers += newNumber
return newNumber
}
}
Использование в обоих случаях:
val numberProvider = UniqueRandomNumbers(0, 2)
// returns 0, 1, 2 or null if all numbers have been consumed
numberProvider.next