Получить случайное число в Котлине

Получить случайный номер в Котлине

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.