So generieren Sie Zufallszahlen in Java

โšก Intelligente Zusammenfassung

Zufallszahlen in Java Sie stammen aus vier verwandten Standardbibliotheksoptionen: der Random-Klasse, Math.random, ThreadLocalRandom und SecureRandom. Jede dieser Optionen bietet eine andere Kombination aus Geschwindigkeit, Thread-Sicherheit und kryptografischer Stรคrke fรผr reale Anwendungen.

  • ๐ŸŽฒ Zufรคllige Klasse: java.util.Random stellt nextInt, nextLong, next bereitDoubleund nextBoolean fรผr hรคufige primitive Datentypen.
  • ๐Ÿงฎ Math.random: Math.random gibt einen Gleitkommawert zwischen 0.0 (einschlieรŸlich) und 1.0 (ausschlieรŸlich) zurรผck, wobei eine gemeinsam genutzte Random-Instanz verwendet wird.
  • ๐ŸŽฏ Benutzerdefinierte Bereiche: รœbergeben Sie nextInt eine Grenze oder scale Math.random, um Werte innerhalb eines beliebigen Minimums und Maximums zu generieren.
  • ๐Ÿงต Gewindesicherheit: ThreadLocalRandom in java.util.concurrent gibt jedem Thread seinen eigenen Generator und ist bei Konflikten einem gemeinsam genutzten Random รผberlegen.
  • ๐Ÿ” Sicherheit: SecureRandom in java.security erzeugt kryptografisch starke Werte fรผr Passwรถrter, Token und Sitzungsschlรผssel.
  • ๐ŸŒฑ Reproduzierbarkeit: Durch die Verwendung eines festen Anfangswerts fรผr eine Zufallsvariable werden Tests und Simulationen รผber verschiedene Durchlรคufe hinweg deterministisch.

So generieren Sie Zufallszahlen in Java

Zufallszahlen tauchen รผberall auf JavaVon Unit-Test-Daten und Wรผrfelspielen bis hin zu Sitzungstoken und gemischten Kartensรคtzen. Dieses Tutorial erklรคrt, wie man Zufallszahlen generiert in Java Wie man alle Optionen der Standardbibliothek nutzt und wie man die richtige fรผr den jeweiligen Zweck auswรคhlt.

Zufallszahl generieren in Java

Das Java Die Standardbibliothek bietet vier gรคngige Methoden zur Erzeugung einer Zufallszahl:

  • java.util.Random ist die universelle Klasse. Sie erzeugt boolesche, int-, long-, float- und double-Werte mithilfe von Methoden wie beispielsweise nextInt, nextLong und nextDouble.
  • Math.random ist eine statische Hilfsfunktion, die einen Gleitkommawert zwischen 0.0 (einschlieรŸlich) und 1.0 (ausschlieรŸlich) mithilfe eines gemeinsamen Speichers zurรผckgibt. Random im Inneren.
  • ThreadLocalRandom in java.util.concurrent Jedem Thread wird ein eigener Generator zugewiesen, sodass mehrere Threads nicht um eine einzige Instanz konkurrieren.
  • SecureRandom in java.security erzeugt kryptografisch starke Pseudozufallszahlen fรผr Passwรถrter, Sitzungskennungen und Schlรผssel.

In den folgenden Abschnitten wird gezeigt, wie man mit jedem Ansatz zehn Zufallszahlen generiert.

Beispiel: Zufallszahl generieren mit Java Zufรคllige Klasse

Das erste Beispiel verwendet java.util.Random um zehn ganze Zahlen im Bereich von 0 bis 99 (einschlieรŸlich) zu erzeugen:

import java.util.Random;

public class RandomNumbers {
    public static void main(String[] args) {
        Random objGenerator = new Random();
        for (int iCount = 0; iCount < 10; iCount++) {
            int randomNumber = objGenerator.nextInt(100);
            System.out.println("Random No : " + randomNumber);
        }
    }
}

Ausgang:

Random No : 17
Random No : 57
Random No : 73
Random No : 48
Random No : 68
Random No : 86
Random No : 34
Random No : 97
Random No : 73
Random No : 18

Eine Instanz von Random wird erstellt als objGenerator. Der nextInt(int bound) Die Methode gibt einen Wert zwischen 0 (einschlieรŸlich) und dem angegebenen Grenzwert (ausschlieรŸlich) zurรผck, nextInt(100) liefert Werte von 0 bis 99. Um die Sequenz reproduzierbar zu machen, รผbergeben Sie dem Konstruktor einen Startwert, zum Beispiel 0. new Random(42)Derselbe Startwert erzeugt immer dieselbe Sequenz, was fรผr Tests und Simulationen nรผtzlich ist.

Beispiel: Verwenden Java Mathe.Zufalls

Um zehn Zufallswerte im Bereich von 0.0 bis 1.0 zu generieren, rufen Sie die statische Funktion auf. Math.random Methode innerhalb einer SchleifeDies ist der schnellste Weg, einen zufรคlligen Double-Wert zu erhalten, ohne ein Generatorobjekt zu erstellen:

public class DemoRandom {
    public static void main(String[] args) {
        for (int xCount = 0; xCount < 10; xCount++) {
            System.out.println(Math.random());
        }
    }
}

Ausgang:

0.46518450373334297
0.14859851177803485
0.5628391820492477
0.6323378498048606
0.1740198445692248
0.9140544122258946
0.9167350036262347
0.49251219841030147
0.7426056725722353
0.2039418871298877

Unter der Haube Math.random erzeugt ein einzelnes statisches Random bei der ersten Nutzung und Anrufen nextDouble Darauf gehen wir ein. Dieser einzelne gemeinsam genutzte Generator ist fรผr Demos ausreichend, wird aber unter hoher Multithread-Last zum Flaschenhals, worauf die nรคchsten Abschnitte eingehen.

Generieren einer Zufallszahl in einem benutzerdefinierten Bereich

Reale Programme benรถtigen รผblicherweise einen Zufallswert innerhalb eines bestimmten Bereichs, beispielsweise eine ganze Zahl zwischen 1 und 6 fรผr einen Wรผrfelwurf oder eine Gleitkommazahl zwischen 10.0 und 20.0 fรผr eine Simulation. Zwei Muster decken nahezu alle Fรคlle ab.

Eine Zufallszahl zwischen Minimum und Maximum (einschlieรŸlich):

import java.util.Random;

public class RangeDemo {
    public static void main(String[] args) {
        Random rnd = new Random();
        int min = 1;
        int max = 6;
        // nextInt(max - min + 1) returns 0..(max-min), then shift by min
        int dice = rnd.nextInt(max - min + 1) + min;
        System.out.println("Dice roll : " + dice);
    }
}

Zufรคllige Doppelzahl zwischen Minimum und Maximum:

double min = 10.0;
double max = 20.0;
double value = min + (max - min) * Math.random();
System.out.println("Value : " + value);

Beide Muster funktionieren, indem sie einen Wert aus dem nativen Bereich des Generators nehmen, ihn auf die Breite des Zielbereichs skalieren und ihn um den Minimalwert nach oben verschieben. Wenn Sie sich auf Java 8 oder hรถher ist das gleiche Ergebnis auch mit der neueren Version mรถglich. ints, longs und doubles Stream-Methoden RandomBeispielsweise rnd.ints(10, 1, 7).forEach(System.out::println) fรผr zehn Wรผrfelwรผrfe.

ThreadLocalRandom fรผr Multithreading Code

Ein einzelnes gemeinsames Random ist threadsicher, aber bei Konflikten langsam, da jeder Thread auf denselben internen Startwert synchronisiert werden muss. ThreadLocalRandom, hinzugefรผgt in Java 7 und lebt in java.util.concurrentDadurch erhรคlt jeder Thread seinen eigenen Generator, sodass es keine Sperrkonflikte gibt.

import java.util.concurrent.ThreadLocalRandom;

public class ThreadLocalDemo {
    public static void main(String[] args) {
        // random int in [1, 100]
        int i = ThreadLocalRandom.current().nextInt(1, 101);

        // random long in [1000, 5000]
        long l = ThreadLocalRandom.current().nextLong(1000L, 5001L);

        // random double in [0.0, 1.0)
        double d = ThreadLocalRandom.current().nextDouble();

        System.out.println(i + " " + l + " " + d);
    }
}

Arbeiten jederzeit weiterbearbeiten kรถnnen. Jede Prรคsentation und jeder KI-Avatar, den Sie von Grund auf neu erstellen oder hochladen, ThreadLocalRandom.current() innerhalb von Worker-Threads, parallelen Streams und beliebigen gleichzeitig ausgefรผhrten Aufgaben. Beachten Sie, dass setSeed wirft UnsupportedOperationExceptionDaher wird das Seeding zur Reproduzierbarkeit nicht unterstรผtzt; wenn Sie einen festen Seed benรถtigen, verwenden Sie einfach die Standardversion. Random.

SecureRandom fรผr sicherheitskritische Zufallszahlen Numbers

Instanzen Random und ThreadLocalRandom sind nicht kryptografisch sicher. Mit wenigen Ausgabebeispielen kann ein Angreifer den internen Zustand rekonstruieren und zukรผnftige Werte vorhersagen. Verwenden Sie fรผr Passwรถrter, Sitzungstoken, Salt-Werte und kryptografische Schlรผssel java.security.SecureRandom Stattdessen entnimmt es dem Entropiepool des Betriebssystems Ausgangsmaterial und erzeugt Werte, die sich Vorhersagen entziehen.

import java.security.SecureRandom;

public class SecureDemo {
    public static void main(String[] args) {
        SecureRandom secure = new SecureRandom();

        byte[] token = new byte[16];
        secure.nextBytes(token);          // 128-bit random token

        int otp = secure.nextInt(1_000_000); // 6-digit one-time code

        System.out.println("OTP : " + String.format("%06d", otp));
    }
}

SecureRandom ist langsamer als Random Weil es stรคrkere Algorithmen und umfangreicheres Ausgangsmaterial verwendet. Verwenden Sie es ausschlieรŸlich fรผr Sicherheitsaufgaben und die schnelleren Generatoren fรผr Spiele, Simulationen und Testdaten.

Hรคufig gestellte Fragen

Erstelle eine Instanz von java.util.Random und rufe nextInt, nextLong und next auf.DoubleAlternativ kรถnnen Sie `nextBoolean` verwenden. Fรผr eine schnelle Einzeiler-Lรถsung bietet sich `Math.random` an, das einen Gleitkommawert zwischen 0.0 und 1.0 zurรผckgibt. Beide Ansรคtze sind in der Standardbibliothek enthalten.

Verwenden Sie `random.nextInt(max โ€“ min + 1) + min` fรผr ganze Zahlen oder `min + (max โ€“ min) * Math.random()` fรผr Gleitkommazahlen. Die Formeln skalieren den Wertebereich des Zufallsgenerators auf Ihr Zielfenster und verschieben ihn um den Minimalwert.

Random ist eine vollstรคndige Klasse mit Methoden fรผr viele primitive Datentypen und unterstรผtzt die Initialisierung. Math.random ist eine statische Hilfsmethode, die einen Gleitkommawert zwischen 0.0 und 1.0 zurรผckgibt. Intern ruft Math.random eine einzige gemeinsam genutzte Random-Instanz auf.

Ja, aber gleichzeitige Aufrufe konkurrieren um denselben internen Startwert, was stark parallelisierten Code verlangsamt. Verwenden Sie `ThreadLocalRandom.current()` aus `java.util.concurrent`, um jedem Thread einen eigenen Generator zuzuweisen und diese Konflikte zu beseitigen.

รœbergeben Sie dem Random-Konstruktor einen festen Wert vom Typ `long`, beispielsweise `new Random(42)`, oder rufen Sie `setSeed(42)` auf. Der Generator erzeugt dann bei jedem Durchlauf dieselbe Sequenz, was fรผr reproduzierbare Tests und Simulationen unerlรคsslich ist.

Verwenden Sie SecureRandom immer dann, wenn der Wert vor Vorhersagen geschรผtzt sein muss, beispielsweise bei Passwรถrtern, Sitzungstoken, Salt-Werten, Einmalcodes und kryptografischen Schlรผsseln. Plain Random ist zwar schnell, aber vorhersehbar und daher fรผr Sicherheitsanwendungen ungeeignet.

Frameworks fรผr maschinelles Lernen verwenden Pseudozufallsgeneratoren, um Gewichte zu initialisieren, Trainingsdaten zu mischen und Validierungsdatensรคtze aufzuteilen. Durch die Festlegung eines Startwerts (Seed) werden Experimente reproduzierbar, sodass Teams Modelllรคufe vergleichen und Ergebnisse zuverlรคssig debuggen kรถnnen.

Ja. GitHub Copilot generiert Code-Snippets fรผr Random, ThreadLocalRandom und SecureRandom und passt die Formeln zur Bereichsskalierung entsprechend an. JUnit Tests. RevPrรผfen Sie jeden Vorschlag, um sicherzustellen, dass die gewรคhlte Klasse zum Anwendungsfall passt, insbesondere bei sicherheitsrelevantem Code.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: