Was lernen wir aus Büchern?
Der offensichtlichste und intuitivste Weg ist, mit einem einfachen Anruf zufällige Zahlen in Java zu generieren:
java.lang.math.random ())
In allen anderen Sprachen ist die Erzeugung von zufälligen Zahlen wie die Verwendung von Mathematik -Tool -Klassen wie ABS, POW, Boden, SQRT und andere mathematische Funktionen. Die meisten Menschen lernen diese Kategorie durch Bücher, Tutorials und Kurse kennen. Ein einfaches Beispiel: Eine doppelte Präzisionsschwimmpunktzahl kann von 0,0 bis 1,0 generiert werden. Anschließend möchte der Entwickler durch die obigen Informationen eine schwimmende Punktzahl mit doppelter Präzision zwischen 0,0 und 10,0 generieren und sie so schreiben:
Math.random () * 10
Wenn eine Ganzzahl zwischen 0 und 10 erzeugt wird, wird er geschrieben als:
Math.round (math.random () * 10)
Fortschrittlich
Durch das Lesen des Quellcodes von Math.Random () oder durch einfach die automatische Abschlussfunktion der IDE können Entwickler leicht feststellen, dass Java.lang.math.random () ein internes zufällig generiertes Objekt verwendet - ein sehr leistungsstarkes Objekt kann flexibel zufällig sein Generation: Boolesche Werte, alle numerischen Typen und sogar Gaußschen Verteilungen. Zum Beispiel:
New Java.util.random (). NextInt (10)
Es hat einen Nachteil, dh es ist ein Objekt. Seine Methode muss durch eine Instanz aufgerufen werden, was bedeutet, dass sein Konstruktor zuerst aufgerufen werden muss. Wenn es ausreichend Speicher gibt, sind Ausdrücke wie die oben genannten akzeptabel.
Eine einfache Lösung, die vermeiden kann, jedes Mal eine neue Instanz zu erstellen, wenn eine Zufallszahl eine statische Klasse verwenden kann. Vielleicht haben Sie an Java.lang.Math gedacht, sehr gut, wir verbessern die Initialisierung von Java.lang.math. Obwohl dieses Projekt niedrig ist, müssen Sie auch einige einfache Unit -Tests durchführen, um sicherzustellen, dass es nicht schief geht.
Unter der Annahme, dass das Programm eine zufällige Nummer zum Speichern generieren muss, kommt das Problem erneut. Beispielsweise ist es manchmal notwendig, Samen zu bedienen oder zu schützen, und eine interne Zahl wird verwendet, um den Zustand zu speichern und die nächste Zufallszahl zu berechnen. In diesen Sonderfällen ist es unangemessen, zufällig generierte Objekte zu teilen.
gleichzeitig
In der Umgebung der Java ee -Multithread -Anwendung können zufällig generierte Instanzobjekte weiterhin in einer Klasse oder einer anderen Implementierungsklasse als statische Eigenschaft gespeichert werden. Glücklicherweise ist Java.util.random mit Thread-Safe, daher besteht kein Risiko, dass mehrere Thread-Anrufe den Samen zerstören.
Eine andere Sache, die es wert ist, nachzudenken, ist die Multithread -Instanz von java.lang.threadlocal. Der faule Ansatz besteht darin, eine einzelne Instanz durch die Java selbst -API zu implementieren.
Obwohl Java keine gute Möglichkeit bietet, eine einzelne Instanz von 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 (). NextInt (10)
Diese neue API kombiniert die Vorteile von zwei weiteren Ansätzen: Einzelinstanz/statischer Zugriff, so flexibel wie Mathematik. Random (). ThreadLocalRandom ist auch schneller als jede andere Möglichkeit, mit hoher Parallelität umzugehen.
Erfahrung
Chris Marasti-Georg weist darauf hin:
Math.round (math.random () * 10)
Machen Sie die Verteilung unausgeglichen, z. So verwenden Sie die alte Stilsyntax, um eine korrekte, ausgewogene Verteilung zu erzielen, wie folgt:
Math.floor (math.random () * 11)
Glücklicherweise, wenn wir java.util.random oder java.util.concurrent.threadLocalRandom verwenden, müssen wir uns keine Sorgen machen.
Das Java Practical Project führt einige der Schäden der fälschlichen Verwendung der api java.util.random ein. Diese Lektion zeigt uns nicht:
Math.abs (Rnd.Nextint ())%n
Und verwenden:
Rnd.Nextint (n)
Ythe oben ist eine verwandte Einführung in die zufälligen Zahlen in Java, und ich hoffe, dass es für das Lernen aller hilfreich sein wird.