Titel   Inhalt   Suchen   Index   API  Go To Java 2, Zweite Auflage, Handbuch der Java-Programmierung
 <<    <     >    >>  Kapitel 16 - Utility-Klassen I

16.1 Die Klasse Random



16.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-Wertes (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.

16.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 Lottotips. 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, daß Zahlen doppelt in den Tip eingehen, und wird zur sortierten Ausgabe des Ergebnisses verwendet:

001 /* Listing1601.java */
002 
003 import java.util.*;
004 
005 public class Listing1601
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 }
Listing1601.java
Listing 16.1: Zufallszahlen zur Generierung eines Lottotips

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 47.1.4, in dem kryptographische Zufallszahlen erläutert werden.

Normalverteilte Zufallszahlen

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

public double nextGaussian()
java.util.Random

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


 Titel   Inhalt   Suchen   Index   API  Go To Java 2, Zweite Auflage, Addison Wesley, Version 2.0
 <<    <     >    >>  © 2000 Guido Krüger, http://www.gkrueger.com