Пропустити до головного контенту

Випадковість в Kotlin

Я думаю ви багато разів зустрічались з поняттям «випадковості». Була це лотерея, чи енеки-бенеки – неважливо. Наше життя постійно спіткає та чи інша випадковість. Розгляньмо, як випадковість працює в Kotlin.

Random

Говорячи про випадковість в Kotlin, будь-який Kotlin-розробник відразу згадає kotlin.random пакет, який вбудований в Kotlin.

За допомогою нього ви можете:

  • генерувати випадкові числа: цілі (Int, Long) та з плаваючою точкою (Float, Double)
  • генерувати випадковий логічний тип Boolean
Не завадить знати

Також, kotlin.random може генерувати байти та біти, але ми ці типи ще не розглядали.

Перейдім до більш практичної частини. Як це все робиться?

Щоб отримати випадкове ціле число, ми можемо використати функцію Random.nextInt(from, until):

Main.kt
import kotlin.random.Random

fun main() {
println(Random.nextInt(0, 9))
}

Виведе:

Console
8

Тобто, випадковість обмежена від 0 до 9.

Увага

Можуть бути будь-які цифри, головне – не переплутати 'від' з 'до' і не зробити наступне Random.nextInt(9, 0). Буде помилка!

За аналогією працюють і інші функції:

Main.kt
import kotlin.random.Random

fun main() {
println(Random.nextInt(0, 9))
println(Random.nextLong(1L, 1000000L))
println(Random.nextDouble(1.9, 9.9))
println(Random.nextBoolean())
}

Виведе приблизно таке:

Console
2
386039
7.176104912683028
false

Вирішім наступне завдання:

Завдання №1

Користувач вводить число від 1 до 30 (перевірте число). Зробіть програму, що буде вгадувати число користувача та друкувати скільки спроб знадобилось, щоб вгадати вказане число.

Спочатку отримаємо число та перевіримо його:

fun main() {
val number = readln().toInt()
if(number < 0 || number > 30) {
println("Число має бути в діапазоні між 1 та 30.")
return // виходимо з функції
}
}

Тепер для того, щоб вгадати число ми можемо скористатись циклічним оператором while

import kotlin.random.Random // додаємо до нашого простору імен тип Random

fun main() {
val number = readln().toInt()
if (number < 0 || number > 30) {
println("Число має бути в діапазоні між 1 та 30.")
return // виходимо з функції
}

var attempt = 0 // робимо змінну, щоб зберігати кількість спроб
while (true) {
if (Random.nextInt(0, 30) == number) {
println("Число було знайдено за $attempt") // робимо конкатенацію
break // виходимо з циклу
}
attempt++ // додаємо 1 до attempt
}
}
Цікаво знати

Якесь незрозуміле attempt++, чи не так? Насправді це просто спрощення для attempt = attempt + 1. Воно також існує і в інший бік: attempt--.

До речі, така операція має два види:

  • префіксний інкеремент / декремент
  • постфіксний інкремент / декремент

В нашому випадку, це постфіксний інкремент. Але чим вони відрізняються?

Префіксний інкремент спочатку додає, а потім повертає значення з виразу, а постфіксний інкремент спочатку віддає значення, а потім додає один. Тобто:

var x = 0
println(x++) // виведе 0
println(x) // тільки тут він виведе 1

var y = 0
println(++y) // виведе 1

І ми розв'язали цю нескладну задачу.