Wie wir alle wissen, sind zufällige Zahlen eine der grundlegendsten Funktionen jeder Programmiersprache. Die grundlegende Methode, um zufällige Zahlen zu generieren, ist die gleiche: Erzeugen Sie zufällige Zahlen zwischen 0 und 1. Scheinbar einfach, aber manchmal ignorieren wir auch einige interessante Funktionen.
Was lernen wir aus Büchern?
Die offensichtlichste und intuitivste Art und Weise, die zufällige Zahl wird in Java generiert, solange sie einfach genannt wird:
java.lang.math.random ())
In allen anderen Sprachen ist die Zufallszahl wie die Verwendung der Mathematik -Toolklasse wie ABS, POW, Boden, SQRT und andere mathematische Funktionen. Die meisten Menschen verstehen diese Klasse durch Bücher, Tutorials und Kurse. Ein einfaches Beispiel: Ein doppelter Schwimmpunkt kann von 0,0 bis 1,0 erzeugt werden. Anschließend müssen Entwickler durch die oben genannten Informationen die schwimmenden Punkte zwischen 0,0 und 10,0 erstellen.
?
Die Ganzzahl zwischen 0 und 10 wird geschrieben als:
Math.round (math.random () * 10)
Vorauszahlung
Durch das Lesen des Quellcodes von Math.Random () oder durch Verwendung der automatischen Abschlussfunktion der IDE können Entwickler leicht feststellen, dass Java.lang.math.random () ein Objekt der internen zufälligen Generation verwendet-ein sehr leistungsstarkes Objekt kann flexibel flexibel flexibel können Zufällige Generation: Boolescher Wert, alle digitalen Typen und sogar Gaußsche Verteilung. Zum Beispiel:
New Java.util.Random ().
Es hat einen Nachteil, dass es sich um ein Objekt handelt. Seine Methode muss durch eine Instanz aufgerufen werden, was bedeutet, dass sie zuerst seinen Konstruktor aufrufen muss. Wenn der obige Ausdruck ausreicht, ist der obige Ausdruck akzeptabel;
Eine einfache Lösung kann vermeiden, jedes Mal ein neues Beispiel zu erstellen, wenn Sie eine Zufallszahl generieren müssen, dh unter Verwendung einer statischen Klasse. Ich denke, Sie mögen an Java.lang.Math denken, sehr gut, wir sind die Initialisierung der Verbesserung von Java.lang.math. Obwohl die Menge dieses Projekts niedrig ist, müssen Sie auch einige einfache Unit -Tests durchführen, um sicherzustellen, dass es keine Fehler macht.
Unter der Annahme, dass das Programm eine zufällige Nummer zum Speichern generieren muss, kommt das Problem erneut. Beispielsweise ist es erforderlich, die Samen (Saatgut) zu bedienen oder zu schützen, und eine interne Zahl wird verwendet, um den Status zu speichern und die nächste Zufallszahl zu berechnen. Unter diesen besonderen Umständen ist es nicht angemessen, zufällige Generierungsobjekte zu teilen.
gleichzeitig
In der Umgebung der Java ee -Multi -Thread -Anwendung können immer noch zufällige Generierungs -Instanzobjekte in Klassen oder anderen Implementierungsklassen als statisches Attribut gespeichert werden. Glücklicherweise ist Java.util.random thread -safe, daher besteht kein Risiko für mehrere Fäden, die die Samen zerstören können.
Ein weiterer Betrachtung ist ein Multi -Thread -Beispiel von java.lang.threadlocal. Der faule Ansatz ist es, durch die Java -API ein einzelnes Beispiel zu erreichen.
Obwohl Java keine gute Möglichkeit bot, Java.util.random zu verwalten. Der lang erwartete Java 7 bietet jedoch eine neue Möglichkeit, zufällige Zahlen zu generieren:
java.util.concurrent.threadlocalrandom.current ().
Diese neue API kombiniert die Vorteile der beiden anderen Methoden: eine einzelne Instanz-/statischen Zugriff, so flexibel wie Mathematik. Random (). ThreadLocalRandom ist ebenfalls schneller als jede andere Verarbeitungsmethode.
Erfahrung
Chris Marasti-Georg wies darauf hin:
Math.round (math.random () * 10)
Unausgeglichene Verteilung beispielsweise: 0,0-0.499999, um die vier Häuser und fünf zu betreten, während 0,5 bis 1,499999 die vier Häuser und fünf in 1 eingeben. So verwenden Sie die alte Grammatik, um die richtige ausgewogene Verteilung zu erreichen, wie folgt:
Math.floor (math.random () * 11)
Zum Glück, wenn wir Java.util.Random oder Java.util.Concurrent.ThreadLocalRandom verwenden, machen Sie sich keine Sorgen um die oben genannten Probleme.
Das tatsächliche Kampfprojekt Java führt den Schaden einer falschen Verwendung von Java.util.Random API vor. Diese Lektion zeigt uns nicht:
Math.abs (Rnd.Nextint ())%n%n
Und verwenden:
Rnd.Nextint (n)