Obtenez un nombre aléatoire à Kotlin

1. Introduction

Ce court tutoriel montrera comment générer un nombre aléatoire à l'aide de Kotlin.

2. Nombre aléatoire utilisant java.lang.Math

Le moyen le plus simple de générer un nombre aléatoire dans Kotlin est d'utiliser java.lang.Math . L'exemple ci-dessous générera un double nombre aléatoire entre 0 et 1.

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

3. Nombre aléatoire utilisant ThreadLocalRandom

Nous pouvons également utiliser java.util.concurrent.ThreadLocalRandom pour générer une valeur double, entière ou longue aléatoire. Les valeurs entières et longues générées de cette manière peuvent être à la fois positives ou négatives .

ThreadLocalRandom est thread-safe et offre de meilleures performances dans un environnement multithread car il fournit unobjet Random séparépour chaque thread et réduit ainsi les conflits entre les threads:

@Test fun whenRandomNumberWithJavaThreadLocalRandom_thenResultsInDefaultRanges() { val randomDouble = ThreadLocalRandom.current().nextDouble() val randomInteger = ThreadLocalRandom.current().nextInt() val randomLong = ThreadLocalRandom.current().nextLong() assertTrue { randomDouble >= 0 } assertTrue { randomDouble = Integer.MIN_VALUE } assertTrue { randomInteger = Long.MIN_VALUE } assertTrue { randomLong < Long.MAX_VALUE } }

4. Nombre aléatoire utilisant Kotlin.js

Nous pouvons également générer un double aléatoire en utilisant la classe Math de la bibliothèque kotlin.js .

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

5. Nombre aléatoire dans une plage donnée en utilisant Pure Kotlin

En utilisant pure Kotlin, nous pouvons créer une liste de nombres, la mélanger puis prendre le premier élément de cette liste:

@Test fun whenRandomNumberWithKotlinNumberRange_thenResultInGivenRange() { val randomInteger = (1..12).shuffled().first() assertTrue { randomInteger >= 1 } assertTrue { randomInteger <= 12 } }

6. Nombre aléatoire dans une plage donnée à l'aide de ThreadLocalRandom

ThreadLocalRandom présenté dans la section 3 peut également être utilisé pour générer un nombre aléatoire dans une plage donnée:

@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 = 1 } assertTrue { randomInteger = 1 } assertTrue { randomLong < 10 } }

7. Générateurs de nombres aléatoires pseudo vs sécurisés

Les implémentations JDK standard de java.util.Random utilisent un générateur congruentiel linéaire pour fournir des nombres aléatoires. Le problème avec cet algorithme est qu'il n'est pas cryptographiquement fort et que ses sorties pourraient être prédites par des attaquants.

Pour résoudre ce problème, nous devons utiliser java.security.SecureRandom dans les endroits où nous avons besoin d'une bonne sécurité:

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

SecureRandom produit des valeurs aléatoires cryptographiquement fortes à l'aide d'un générateur de nombres pseudo-aléatoires cryptographiquement fort (CSPRNG).

Les applications ne doivent pas utiliser d'autres moyens de générer un nombre aléatoire sécurisé dans des endroits liés à la sécurité.

8. Conclusion

Dans cet article, nous avons appris quelques façons de générer un nombre aléatoire dans Kotlin.

Comme toujours, tout le code présenté dans ce didacticiel se trouve à l'adresse over sur GitHub.