In gewissem Maße sind Zufallszahlengeneratoren Pferde für Kurse. Die Klasse Random implementiert einen LCG mit vernünftig gewählten Parametern. Dennoch weist sie die folgenden Merkmale auf:
Wenn diese Dinge für Sie keine Rolle spielen, dann hat Random den Vorteil, dass es als Teil des JDK bereitgestellt wird. Es ist gut genug für gelegentliche Spiele (aber nicht für solche, bei denen es um Geld geht). Es gibt keine schwachen Samen als solche.
Eine weitere Alternative ist die XORShift-Generator die in Java wie folgt implementiert werden kann:
public long randomLong() {
x ^= (x << 21);
x ^= (x >>> 35);
x ^= (x << 4);
return x;
}
Für einige sehr billige Operationen hat dies eine Periode von 2^64-1 (Null ist nicht erlaubt), und ist einfach genug, um inlined zu werden, wenn Sie Werte wiederholt erzeugen. Es sind verschiedene Verschiebungswerte möglich: siehe George Marsaglias Arbeit über XORShift-Generatoren für weitere Details. Sie können die Bits in den erzeugten Zahlen als gleichermaßen zufällig betrachten. Eine Hauptschwäche ist, dass es gelegentlich in einen "Trott" gerät, bei dem nicht viele Bits in der Zahl gesetzt sind, und dann dauert es ein paar Generationen, um aus diesem Trott herauszukommen.
Andere Möglichkeiten sind:
- Kombination verschiedener Generatoren (z. B. Einspeisung der Ausgabe eines XORShift-Generators in einen LCG und anschließende Addition des Ergebnisses mit der Ausgabe eines XORShift-Generators mit anderen Parametern): Auf diese Weise können im Allgemeinen die Schwächen der verschiedenen Methoden "geglättet" werden, und es kann eine längere Periode erzielt werden, wenn die Perioden der kombinierten Generatoren sorgfältig gewählt werden
- eine "Verzögerung" hinzufügen (um einen längeren Zeitraum zu erhalten): Im Wesentlichen wird an der Stelle, an der ein Generator normalerweise die zuletzt erzeugte Zahl umwandeln würde, ein "Historienpuffer" gespeichert und z. B. die (n-1023)-te umgewandelt.
Ich würde sagen, vermeiden Sie Generatoren, die eine dumme Menge an Speicher verwenden, um Ihnen eine längere Periode zu geben, als Sie wirklich brauchen (einige haben eine Periode, die größer ist als die Anzahl der Atome im Universum - das brauchen Sie normalerweise nicht). Und beachten Sie, dass "lange Periode" nicht unbedingt "qualitativ hochwertiger Generator" bedeutet (obwohl 2^48 immer noch ein bisschen wenig ist!).