Ottieni un numero casuale a Kotlin

1. Introduzione

Questo breve tutorial dimostrerà come generare un numero casuale usando Kotlin.

2. Numero casuale utilizzando java.lang.Math

Il modo più semplice per generare un numero casuale in Kotlin è usare java.lang.Math . L'esempio seguente genererà un doppio numero casuale compreso tra 0 e 1.

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

3. Numero casuale utilizzando ThreadLocalRandom

Possiamo anche usare java.util.concurrent.ThreadLocalRandom per generare un valore random double, integer o long. I valori interi e lunghi generati in questo modo possono essere sia positivi che negativi .

ThreadLocalRandom è thread-safe e offre prestazioni migliori in un ambiente multithread perché fornisce unoggetto Random separatoper ogni thread e quindi riduce la contesa tra i thread:

@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. Numero casuale utilizzando Kotlin.js

Possiamo anche generare un double casuale usando la classe Math dalla libreria kotlin.js .

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

5. Numero casuale in un dato intervallo utilizzando Pure Kotlin

Usando puro Kotlin, possiamo creare un elenco di numeri, mescolarlo e quindi prendere il primo elemento da quell'elenco :

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

6. Numero casuale in un determinato intervallo utilizzando ThreadLocalRandom

ThreadLocalRandom presentato nella sezione 3 può anche essere utilizzato per generare un numero casuale in un determinato intervallo:

@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. Generatori di numeri casuali pseudo vs sicuri

Le implementazioni JDK standard di java.util.Random utilizzano un generatore di congruenza lineare per fornire numeri casuali. Il problema con questo algoritmo è che non è crittograficamente forte e i suoi output potrebbero essere previsti dagli aggressori.

Per superare questo problema, dovremmo usare java.security.SecureRandom in luoghi in cui abbiamo bisogno di una buona sicurezza:

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

SecureRandom produce valori casuali crittograficamente forti utilizzando un generatore di numeri pseudocasuali crittograficamente forti (CSPRNG).

Le applicazioni non dovrebbero utilizzare altri modi per generare un numero casuale sicuro in luoghi correlati alla sicurezza.

8. Conclusione

In questo articolo, abbiamo imparato alcuni modi per generare un numero casuale in Kotlin.

Come sempre, tutto il codice presentato in questo tutorial può essere trovato su GitHub.