Как получить случайное число
import kotlin.random.Random
fun main() {
val dice = (1..6).random()
println("Dice: $dice")
val n = Random.nextInt(1, 101)
println("From 1 to 100: $n")
val x = Random.nextDouble()
println("From 0 to 1: $x")
val names = listOf("Anna", "Oleg", "Ivan")
println(names.random())
println(names.shuffled())
}Программа при каждом запуске выводит разное, поэтому вывода здесь нет. Что делает каждая строка:
| Запись | Что даёт |
|---|---|
(1..6).random() | целое от 1 до 6, обе границы входят |
Random.nextInt(1, 101) | целое от 1 до 100: правая граница не входит |
Random.nextInt(10) | целое от 0 до 9 |
Random.nextDouble() | дробное от 0 (включительно) до 1 (не включая) |
Random.nextBoolean() | true или false |
list.random() | случайный элемент списка |
list.shuffled() | новый список в случайном порядке |
Для простых задач удобнее всего (1..6).random(): границы видны прямо в записи и обе входят. У Random.nextInt(from, until) вторая граница не входит — частая ошибка «кубик никогда не выдаёт 6» при Random.nextInt(1, 6).
Импорт
Random нужно подключить строкой import kotlin.random.Random в начале файла. Функциям random() у диапазона и списка импорт не нужен.
Если IntelliJ IDEA предложила подключить java.util.Random, откажитесь: это другой класс из Java, и с ним Random.nextInt(1, 101) без создания объекта не соберётся.
Пример: угадай число
fun main() {
val secret = (1..100).random()
var attempts = 0
while (true) {
print("Your guess: ")
val guess = readln().toIntOrNull() ?: continue
attempts++
if (guess < secret) {
println("More")
} else if (guess > secret) {
println("Less")
} else {
println("Right! Attempts: $attempts")
break
}
}
}toIntOrNull() ?: continue — если введено не число, цикл просто спрашивает снова.
Одна и та же последовательность: seed
Иногда нужно, чтобы «случайные» числа при каждом запуске были одинаковыми — например, для проверки программы. Для этого создают генератор с начальным числом (seed):
import kotlin.random.Random
fun main() {
val rnd = Random(42)
println(rnd.nextInt(1, 7))
println(rnd.nextInt(1, 7))
}При каждом запуске эта программа выведет одни и те же два числа. С другим начальным числом — другие, но тоже каждый раз одинаковые.
Подводные камни
random()у пустого списка бросает ошибкуNoSuchElementException. Если список может быть пустым —randomOrNull().- Перемешать изменяемый список на месте —
list.shuffle();shuffled()возвращает новый список. - Для паролей, ключей и кодов подтверждения обычный
Randomне годится: его значения можно предсказать. Для них беритеjava.security.SecureRandom.