Titel | Inhalt | Suchen | Index | API | Go To Java 2, Zweite Auflage, Handbuch der Java-Programmierung |
<< | < | > | >> | Kapitel 16 - Utility-Klassen I |
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.
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. |
|
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 |
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. |
|
Weitere Informationen zu Zufallszahlen finden sich in Abschnitt 47.1.4, in dem kryptographische Zufallszahlen erläutert werden.
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 |