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.

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.Randomist die universelle Klasse. Sie erzeugt boolesche, int-, long-, float- und double-Werte mithilfe von Methoden wie beispielsweisenextInt,nextLongundnextDouble.Math.randomist eine statische Hilfsfunktion, die einen Gleitkommawert zwischen 0.0 (einschlieรlich) und 1.0 (ausschlieรlich) mithilfe eines gemeinsamen Speichers zurรผckgibt.Randomim Inneren.ThreadLocalRandominjava.util.concurrentJedem Thread wird ein eigener Generator zugewiesen, sodass mehrere Threads nicht um eine einzige Instanz konkurrieren.SecureRandominjava.securityerzeugt 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.
