Erhalte eine Zufallszahl in Kotlin

Holen Sie sich eine Zufallszahl in Kotlin

1. Einführung

Dieses kurze Tutorial zeigt, wie man mit Kotlin eine Zufallszahl generiert.

2. Zufallszahl mitjava.lang.Math

Der einfachste Weg, eine Zufallszahl in Kotlin zu generieren, ist die Verwendung vonjava.lang.Math. Das folgende Beispiel generiert eine zufällige doppelte Zahl zwischen 0 und 1.

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

3. Zufallszahl mitThreadLocalRandom

Wir können auchjava.util.concurrent.ThreadLocalRandom verwenden, um einen zufälligen Doppel-, Ganzzahl- oder Langwert zu generieren. 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, weil es für jeden Thread ein separatesRandom-Objekt bereitstellt und somit Konflikte zwischen Threads reduziert:

@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. Zufallszahl mit Kotlin.js

Wir können auch ein zufälliges Doppelusing the Math class from the kotlin.js library erzeugen.

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

5. Zufallszahl in einem bestimmten Bereich mit reinem Kotlin

Mit reinem Kotlin können wircreate a list of numbers, shuffle it and then take the first element aus dieser Liste entfernen:

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

6. Zufallszahl in einem bestimmten Bereich mitThreadLocalRandom

ThreadLocalRandom in Abschnitt 3 können auch verwendet werden, um eine Zufallszahl in einem bestimmten Bereich zu generieren:

@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. Pseudo vs sichere Zufallszahlengeneratoren

Standard-JDK-Implementierungen vonjava.util.Random verwendenLinear Congruential Generator, um Zufallszahlen bereitzustellen. Das Problem bei diesem Algorithmus ist, dass er nicht kryptografisch stark ist und seine Ergebnisse von Angreifern vorhergesagt werden können.

Um dieses Problem zu lösen, istwe should use java.security.SecureRandoman Orten, an denen wir gute Sicherheit benötigen:

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

SecureRandom erzeugt kryptografisch starke Zufallswerte unter Verwendung eines kryptografisch starken Pseudozufallszahlengenerators (CSPRNG).

Anwendungen sollten keine anderen Methoden zum Generieren einer sicheren Zufallszahl an sicherheitsrelevanten Stellen verwenden.

8. Fazit

In diesem Artikel haben wir einige Möglichkeiten kennengelernt, wie Sie in Kotlin eine Zufallszahl generieren können.

Wie immer befindet sich der gesamte in diesem Lernprogramm vorgestellte Code inover on GitHub.