Випадковість в Kotlin
Я думаю ви багато разів зустрічались з поняттям «випадковості». Була це лотерея, чи енеки-бенеки – неважливо. Наше життя постійно спіткає та чи інша випадковість. Розгляньмо, як випадковість працює в Kotlin.
Random
Говорячи про випадковість в Kotlin, будь-який Kotlin-розробник відразу згадає kotlin.random
пакет, який вбудований в Kotlin.
За допомогою нього ви можете:
- генерувати випадкові числа: цілі (
Int
,Long
) та з плаваючою точкою (Float
,Double
) - генерувати випадковий логічний тип
Boolean
Також, kotlin.random
може генерувати байти та біти, але ми ці типи ще не розглядали.
Перейдім до більш практичної частини. Як це все робиться?
Щоб отримати випадкове ціле число, ми можемо використати функцію Random.nextInt(from, until)
:
import kotlin.random.Random
fun main() {
println(Random.nextInt(0, 9))
}
Виведе:
8
Тобто, випадковість обмежена від 0 до 9.
Можуть бути будь-які цифри, головне – не переплутати
'від' з 'до' і не зробити наступне Random.nextInt(9, 0)
. Буде помилка!
За аналогією працюють і інші функції:
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())
}
Виведе приблизно таке:
2
386039
7.176104912683028
false
Вирішім наступне завдання:
Користувач вводить число від 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
І ми розв'язали цю нескладну задачу.