Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage
 <<    <     >    >>   API  Kapitel 17 - Utility-Klassen I

17.1 Die Klasse Random



17.1.1 Initialisierung des Zufallszahlengenerators

Zufallszahlen werden beim Programmieren erstaunlich häufig gebraucht, beispielsweise für Simulationen, für Spiele oder zum Aufbau von Testszenarien. Java stellt zu diesem Zweck eine Klasse Random zur Verfügung, mit der Zufallszahlen erzeugt werden können. Sie basiert auf dem Linear-Kongruenz-Algorithmus, wie er beispielsweise in D.E. Knuths »The Art Of Computer Programming, Vol. 2« beschrieben ist.

Die Klasse Random erlaubt das Instanzieren eines Zufallszahlengenerators mit oder ohne manuelles Setzen des seed-Werts (also der internen Zufallsvariable):

public Random()

public Random(long seed)
java.util.Random

Wird der seed-Parameter übergeben, initialisiert der Zufallszahlengenerator seinen internen Zähler mit diesem Wert und die anschließend erzeugte Folge von Zufallszahlen ist reproduzierbar. Wird dagegen der parameterlose Konstruktor aufgerufen, initialisiert er den Zufallszahlengenerator auf der Basis der aktuellen Systemzeit. Die Zufallszahlenfolge ist in diesem Fall nicht reproduzierbar.

17.1.2 Erzeugen von Zufallszahlen

Gleichverteilte Zufallszahlen

Der Zufallszahlengenerator kann Zufallszahlen für die numerischen Grundtypen int, long, float oder double erzeugen. Durch Aufruf einer der Methoden nextInt, nextLong, nextFloat oder nextDouble wird die jeweils nächste Zufallszahl des entsprechenden Typs ermittelt und an den Aufrufer zurückgegeben:

public int nextInt()
public int nextInt(int n)

public long nextLong()

public float nextFloat()

public double nextDouble()
java.util.Random

Anders als in vielen anderen Programmiersprachen liefern diese Methoden Ergebnisse aus dem gesamten Wertebereich des entsprechenden Grundtyps, also auch negative Zufallszahlen. Soll der Rückgabewert auf Werte größer gleich null beschränkt werden, kann das Ergebnis mit Math.abs in einen positiven Wert umgewandelt werden.

 Hinweis 

Sollen nur ganzzahlige Zufallswerte unterhalb einer bestimmten Obergrenze n erzeugt werden, kann das Ergebnis zusätzlich modulo n genommen werden. Sollen nur positive Ganzzahlen (inklusive 0) erzeugt werden, kann die mit einem int parametrisierte Variante von nextInt verwendet werden. Zurückgegeben werden gleichverteilte Zufallszahlen zwischen 0 (inklusive) und n (exklusive).

Das folgende Beispiel zeigt die Verwendung von Zufallszahlen zur Generierung eines Lottotipps. Hierbei werden durch Aufruf von nextInt ganzzahlige Zufallszahlen erzeugt und mit Hilfe der abs-Methode und des Modulo-Operators auf den Wertebereich von 1 bis 49 beschränkt. BitSet b verhindert, dass Zahlen doppelt in den Tipp eingehen, und wird zur sortierten Ausgabe des Ergebnisses verwendet:

001 /* Listing1701.java */
002 
003 import java.util.*;
004 
005 public class Listing1701
006 {
007   public static void main(String[] args)
008   {
009     BitSet b = new BitSet();
010     Random r = new Random();
011 
012     System.out.print("Mein Lottotip: ");
013     int cnt = 0;
014     while (cnt < 6) {
015       int num = 1 + Math.abs(r.nextInt()) % 49;
016       if (!b.get(num)) {
017         b.set(num);
018         ++cnt;
019       }
020     }
021     for (int i = 1; i <= 49; ++i) {
022       if (b.get(i)) {
023         System.out.print(i + " ");
024       }
025     }
026     System.out.println("");
027   }
028 }
Listing1701.java
Listing 17.1: Zufallszahlen zur Generierung eines Lottotipps

Eine etwas einfacher zu handhabende Methode zur Erzeugung von Fließkomma-Zufallszahlen befindet sich in der Klasse Math. Die Klassenmethode Math.random kann als Klassenmethode ohne Instanzierung eines Objekts verwendet werden und erzeugt gleichverteilte Zufallszahlen auf der Basis von nextDouble.

 Tip 

Weitere Informationen zu Zufallszahlen finden sich in Abschnitt 50.1.4, in dem kryptografische Zufallszahlen erläutert werden.

Normalverteilte Zufallszahlen

Während diese Methoden gleichverteilte Zufallszahlen erzeugen, liefert die Methode nextGaussian die Zufallszahlen auf der Basis einer Normalverteilung mit einem Mittelwert von 0.0 und einer Standardabweichung von 1.0 (sogenannte standardnormalverteilte Zufallszahlen):

public double nextGaussian()
java.util.Random

Auch hier erzeugt jeder weitere Aufruf die jeweils nächste Zufallszahl auf der Basis des vorherigen Werts.

Sollen normalverteilte Zufallszahlen mit einem von 0 verschiedenen Mittelwert und/oder einer von 1 verschiedenen Standardabweichung erzeugt werden, kann ebenfalls nextGaussian verwendet werden. Dazu ist lediglich das jeweilige Ergebnis mit der gewünschten Standardabweichung zu multiplizieren und anschließend zum gewünschten Mittelwert zu addieren.

 Tip 


 Titel   Inhalt   Suchen   Index   DOC  Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0
 <<    <     >    >>   API  © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de