Найти в Дзене

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

Этот короткий урок продемонстрирует, как генерировать случайное число с использованием Kotlin. Самый простой способ сгенерировать случайное число в Kotlin — это использовать java.lang.Math. Пример ниже генерирует случайное число типа double между 0 и 1. @Test
fun whenRandomNumberWithJavaUtilMath_thenResultIsBetween0And1() {
val randomNumber = Math.random()
assertTrue { randomNumber >= 0 }
assertTrue { randomNumber < 1 }
} Мы также можем использовать java.util.concurrent.ThreadLocalRandom для генерации случайных чисел типа double, int или long. Числа, генерируемые таким способом, могут быть как положительными, так и отрицательными. ThreadLocalRandom является безопасным для многозадачности и обеспечивает лучшую производительность в многозадачных средах, потому что предоставляет отдельный объект Random для каждого потока, уменьшая конкуренцию между потоками: @Test
fun whenRandomNumberWithJavaThreadLocalRandom_thenResultsInDefaultRanges() {
val randomDouble = ThreadLocalR
Оглавление

1. Введение

Этот короткий урок продемонстрирует, как генерировать случайное число с использованием Kotlin.

2. Случайное число с использованием java.lang.Math

Самый простой способ сгенерировать случайное число в Kotlin — это использовать java.lang.Math. Пример ниже генерирует случайное число типа double между 0 и 1.

@Test
fun whenRandomNumberWithJavaUtilMath_thenResultIsBetween0And1() {
val randomNumber = Math.random()
assertTrue { randomNumber >= 0 }
assertTrue { randomNumber < 1 }
}

3. Случайное число с использованием ThreadLocalRandom

Мы также можем использовать java.util.concurrent.ThreadLocalRandom для генерации случайных чисел типа double, int или long. Числа, генерируемые таким способом, могут быть как положительными, так и отрицательными.

ThreadLocalRandom является безопасным для многозадачности и обеспечивает лучшую производительность в многозадачных средах, потому что предоставляет отдельный объект 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

Мы также можем генерировать случайное число типа double с использованием класса Math из библиотеки kotlin.js.

@Test
fun whenRandomNumberWithKotlinJSMath_thenResultIsBetween0And1() {
val randomDouble = Math.random()
assertTrue { randomDouble >= 0 }
assertTrue { randomDouble < 1 }
}

5. Случайное число в заданном диапазоне с использованием чистого Kotlin

Используя чистый Kotlin, можно создать список чисел, перемешать его и взять первый элемент из этого списка:

@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. Псевдослучайные и безопасные генераторы случайных чисел

Стандартные реализации java.util.Random используют алгоритм линейного конгруэнтного генератора для получения случайных чисел. Проблема этого алгоритма в том, что он не является криптографически стойким, и злоумышленники могут предсказать его выходные данные.

Чтобы решить эту проблему, следует использовать java.security.SecureRandom в тех местах, где требуется высокая безопасность:

fun whenRandomNumberWithJavaSecureRandom_thenResultsInGivenRanges() {
val secureRandom = SecureRandom()
secureRandom.nextInt(100)
assertTrue { randomLong >= 0 }
assertTrue { randomLong < 100 }
}

SecureRandom генерирует криптографически стойкие случайные значения с использованием криптографически стойкого псевдослучайного числа (CSPRNG).

Приложения не должны использовать другие способы генерации безопасных случайных чисел в местах, где это важно для безопасности.

8. Генерация неповторяющихся случайных чисел в Kotlin

В некоторых сценариях нам может понадобиться сгенерировать последовательность случайных чисел, где каждое число появляется только один раз. Kotlin предоставляет несколько способов сделать это.

8.1. Использование shuffled()

Мы уже упоминали использование shuffled() для генерации случайного числа в разделе 5. Однако это также можно использовать для создания коллекции неповторяющихся случайных чисел. Эта функция перемешивает порядок чисел в диапазоне, обеспечивая, чтобы каждое число появлялось только один раз:

@Test
fun whenRandomNonRepeatingNumbersWithShuffle_thenResultsAreUnique() {
val randomNumbers = (1..10).shuffled().take(5)
assertTrue { randomNumbers.distinct().size == randomNumbers.size }
}

В этом примере мы создаём диапазон от 1 до 10, перемешиваем его, чтобы случайным образом упорядочить, и затем берём первые пять чисел. Функция shuffled() гарантирует, что ни одно число не повторяется.

8.2. Использование последовательностей

Мы можем использовать generateSequence вместе с функцией distinct() для генерации последовательности неповторяющихся случайных чисел:

@Test
fun whenRandomNonRepeatingNumbersWithSequence_thenResultsAreUnique() {
val randomNumbers = generateSequence { Random.nextInt(1, 11) }.distinct().take(5).toList()
assertTrue { randomNumbers.distinct().size == randomNumbers.size }
}

Мы создали последовательность, которая генерирует случайные числа от 1 до 10. Затем используем функцию distinct(), чтобы исключить повторяющиеся числа, и берём первые пять уникальных чисел.

9. Заключение

В этой статье мы рассмотрели несколько способов генерации случайных чисел в Kotlin.

Оригинал статьи: https://www.baeldung.com/kotlin/random-number