Глиф Учебники

Как получить случайное число

Справочник · Kotlin · 1 минута чтения

Kotlin
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) без создания объекта не соберётся.

Пример: угадай число

Kotlin
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):

Kotlin
import kotlin.random.Random

fun main() {
    val rnd = Random(42)
    println(rnd.nextInt(1, 7))
    println(rnd.nextInt(1, 7))
}

При каждом запуске эта программа выведет одни и те же два числа. С другим начальным числом — другие, но тоже каждый раз одинаковые.

Подводные камни