Получить случайный номер в Котлине
1. Вступление
Этот короткий урок покажет, как генерировать случайное число с помощью Kotlin.
2. Случайное число с использованиемjava.lang.Math
Самый простой способ сгенерировать случайное число в Kotlin - использоватьjava.lang.Math. Ниже приведен пример случайного двойного числа от 0 до 1.
@Test
fun whenRandomNumberWithJavaUtilMath_thenResultIsBetween0And1() {
val randomNumber = Math.random()
assertTrue { randomNumber >= 0 }
assertTrue { randomNumber < 1 }
}
3. Случайное число с использованиемThreadLocalRandom
Мы также можем использоватьjava.util.concurrent.ThreadLocalRandom для генерации случайного числа типа double, integer или long. Integer and long values generated this way can be both positive or negative.
ThreadLocalRandom is thread-safe and provides better performance in a multithreaded environment, потому что он предоставляет отдельный объектRandom для каждого потока и, таким образом, уменьшает конкуренцию между потоками:
@Test
fun whenRandomNumberWithJavaThreadLocalRandom_thenResultsInDefaultRanges() {
val randomDouble = ThreadLocalRandom.current().nextDouble()
val randomInteger = ThreadLocalRandom.current().nextInt()
val randomLong = ThreadLocalRandom.current().nextLong()
assertTrue { randomDouble >= 0 }
assertTrue { randomDouble < 1 }
assertTrue { randomInteger >= Integer.MIN_VALUE }
assertTrue { randomInteger < Integer.MAX_VALUE }
assertTrue { randomLong >= Long.MIN_VALUE }
assertTrue { randomLong < Long.MAX_VALUE }
}
4. Случайное число с помощью Kotlin.js
Мы также можем сгенерировать случайный двойнойusing the Math class from the kotlin.js library.
@Test
fun whenRandomNumberWithKotlinJSMath_thenResultIsBetween0And1() {
val randomDouble = Math.random()
assertTrue { randomDouble >=0 }
assertTrue { randomDouble < 1 }
}
5. Случайное число в заданном диапазоне с использованием чистого Котлина
Используя чистый Kotlin, мы можемcreate a list of numbers, shuffle it and then take the first element из этого списка:
@Test
fun whenRandomNumberWithKotlinNumberRange_thenResultInGivenRange() {
val randomInteger = (1..12).shuffled().first()
assertTrue { randomInteger >= 1 }
assertTrue { randomInteger <= 12 }
}
6. Случайное число в заданном диапазоне с использованиемThreadLocalRandom
ThreadLocalRandom, представленный в разделе 3, также можно использовать для генерации случайного числа в заданном диапазоне:
@Test
fun whenRandomNumberWithJavaThreadLocalRandom_thenResultsInGivenRanges() {
val randomDouble = ThreadLocalRandom.current().nextDouble(1.0, 10.0)
val randomInteger = ThreadLocalRandom.current().nextInt(1, 10)
val randomLong = ThreadLocalRandom.current().nextLong(1, 10)
assertTrue { randomDouble >= 1 }
assertTrue { randomDouble < 10 }
assertTrue { randomInteger >= 1 }
assertTrue { randomInteger < 10 }
assertTrue { randomLong >= 1 }
assertTrue { randomLong < 10 }
}
7. Псевдо против безопасных генераторов случайных чисел
Стандартные реализации JDKjava.util.Random используютLinear Congruential Generator для предоставления случайных чисел. Проблема с этим алгоритмом в том, что он не является криптографически стойким, и его результаты могут быть предсказаны злоумышленниками.
Чтобы решить эту проблему, используйтеwe should use java.security.SecureRandom в местах, где нам нужна хорошая безопасность:
fun whenRandomNumberWithJavaSecureRandom_thenResultsInGivenRanges() {
val secureRandom = SecureRandom()
secureRandom.nextInt(100)
assertTrue { randomLong >= 0 }
assertTrue { randomLong < 100 }
}
SecureRandom производит криптостойкие случайные значения, используя криптостойкий генератор псевдослучайных чисел (CSPRNG).
Приложения не должны использовать другие способы генерации безопасного случайного числа в местах, связанных с безопасностью.
8. Заключение
В этой статье мы узнали несколько способов генерировать случайное число в Kotlin.
Как всегда, весь код, представленный в этом руководстве, можно найтиover on GitHub.