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

## 16.1 Die Klasse Random

- 16.1 Die Klasse Random
  - 16.1.1 Initialisierung des Zufallszahlengenerators
  - 16.1.2 Erzeugen von Zufallszahlen
    - Gleichverteilte Zufallszahlen
    - Normalverteilte Zufallszahlen

### 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 | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de