Die Zufallszahlen werden mit der Methode random() aus der Klasse Math erzeugt.
double z = Math.random() erzeugt eine Zufallszahl zwischen 0 (inklusive) und 1 (exklusive).
Mit passenden arithmetischen Operationen kann man aus diesen Zahlen ganzzahlige Zufallszahlen in einem beliebigen Wertebereich erzeugen.
Beispiele:
int z = (int)(Math.random() * 6) + 1 erzeugt eine der Zahlen 1, 2, 3, 4, 5 oder 6
int z = (int)(Math.random() * 49) + 1 erzeugt Lottozahlen
Beispiel 1: Simuliert das Werfen zweier Münzen
// KopfZahl.java import ch.aplu.util.*; class KopfZahl extends Console { KopfZahl() { print("Anzahl Versuche eingeben:"); int n = readInt(); int kk = 0; // Anzahl Versuche mit Ausgang 2 mal Kopf int zz = 0; // Anzahl Versuche mit Ausgang 2 mal Zahl int kz = 0; // Anzahl Versuche mit Ausgang 1 mal Kopf und 1 mal Zahl for(int i = 0; i < n; i++) { int x = (int)(Math.random() * 2); // Zufallszahl 0 oder 1 int y = (int)(Math.random() * 2); // Zufallszahl 0 oder 1 if (x == 0 && y == 0) kk++; else if (x == 1 && y == 1) zz++; else kz++; } println ("W'keit 2 mal Kopf 0 mal Zahl: " + (double)kk/n); println ("W'keit 1 mal Kopf 1 mal Zahl: " + (double)kz/n); println ("W'keit 0 mal Kopf 2 Mal Zahl: " + (double)zz/n); } public static void main(String[] args) { new KopfZahl(); } } |
Erklärungen zum Programmcode:
int x = (int)(Math.random() * 2) | Erzeugt zufällig 0 oder 1 |
(double) kk / n) | kk/n ist eine Integerdivision, d.h. die Dezimalstellen werden vernachlässigt. (double)kk bewirkt, dass kk zuerst in einen Double verwandelt wird (cast-Operator). Die nachfolgende Division ist dann automatisch eine Dezimal-Division. |
Beispiel 2: Unter der Verwendung von Arrays kann die Simulation auf beliebig viele Münzen erweitert werden
// KopfZahlEx2.java import ch.aplu.util.*; class KopfZahlEx2 extends Console { KopfZahlEx2() { print("Anzahl Versuche: "); int n = readInt(); int[] k = new int [4]; for (int i = 0; i < 4; i++) k[i] = 0; for(int i = 0; i < n; i++) { int a = 0; for(int j = 0; j < 3; j++) { int x = (int)(Math.random() * 2); if (x == 0) a = a + 1; } if (a == 0) k[0]++; if (a == 1) k[1]++; if (a == 2) k[2]++; if (a == 3) k[3]++; } for(int i = 0; i < 4; i++) println("Wahrscheinlichkeit " + i + "mal Kopf " + (double)k[i]/n); } public static void main(String[] args) { new KopfZahlEx2(); } } |
Beispiel 3: Simuliert Zahlenlotto. Aus 49 Zahlen werden 6 zufällig gezogen und der Grösse nach sortiert ausgegeben.
// Zahlenlotto.java import ch.aplu.util.*; class Zahlenlotto extends Console { int[] zahlen = new int[6]; int z; Zahlenlotto() { println("Sechs Zalenlotto-Zahlen werden zufaellig gezogen:"); ziehen(); print(); sortieren(zahlen); println("Sortiert:"); print(); } void ziehen() { for (int i = 0; i < 6; i++) { //prüfen, ob die neu gezogene Zahl bereits vorkommt boolean gleich = true; //so lange die neu erzeugte Zufallszahl bereits vorkommt while (gleich) { z = (int)(49 * Math.random() + 1); boolean neu = true; //Flag setzen for (int j = 0; j < i && neu; j++) { if (z == zahlen[j]) neu = false; //Flag der auf false gesetzt wird, falls gleiche Zahl bereits vorkommt } if (neu) gleich = false; //while-Schleife wird abgebrochen, z wird ins Array geschrieben } zahlen[i] = z; } } void print() { for (int i = 0; i < 6; i++) print(" " + zahlen[i]); println(" "); } int [] sortieren(int [] zahlen) { for (int i = 5; i >= 0; i--) { for (int j = 0; j < i; j++) { if (zahlen[j] > zahlen[j + 1]) { int temp = zahlen[j + 1]; //speichert die kleinere Zahl in temp zahlen[j + 1] = zahlen[j]; //tauscht die Zahlen so dass j+1 grösser ist zahlen[j] = temp; } } } return zahlen; } public static void main(String[] args) { new Zahlenlotto(); } } |
Erklärungen zum Programmcode:
Dieses Beispiel umfasst zwei wichtige Programmiertechniken: