Zufälligkeit
Verschlüsselungsalgorithmen, maschinelles Lernen und Computerspielen erfordern alle Zufälligkeit. Wir können Zufälligkeit durch die Verwendung von Zufallszahlen modellieren. Java bietet die fertige Random
-Klasse zum Erstellen von Zufallszahlen an. Ein Exemplar der Random-Klasse kann wie folgt verwendet werden:
import java.util.Random;
public class Raffle {
public static void main(String[] args) {
Random ladyLuck = new Random(); // create Random object ladyLuck
for (int i = 0; i < 10; i++) {
// Draw and print a random number
int randomNumber = ladyLuck.nextInt(10);
System.out.println(randomNumber);
}
}
}
Oben erstellen wir eine Instanz der Random
-Klasse. Diese verfügt über die Methode nextInt
, die als Parameter eine ganze Zahl erhält. Die Methode gibt eine Zufallszahl im Bereich von [0, integer[
oder 0..(integer - 1) zurück.
Die Programmausgabe ist nicht immer gleich. Eine mögliche Ausgabe könnte wie folgt aussehen:
2 2 4 3 4 5 6 0 7 8
Wir können die Methode nextInt
verwenden, um vielfältige Zufälligkeiten zu erzeugen. Beispielsweise könnte ein Programm benötigt werden, das eine Temperatur zwischen [-30, 50] angibt. Dies kann erreicht werden, indem zuerst eine Zufallszahl zwischen 0 und 80 erzeugt und dann 30 davon subtrahiert wird.
Random weatherMan = new Random();
int temperature = weatherMan.nextInt(81) - 30;
System.out.println(temperature);
Ein Random
-Objekt kann auch verwendet werden, um zufällige double
-Werte zu erzeugen. Diese können beispielsweise zur Berechnung von Wahrscheinlichkeiten verwendet werden. Computer simulieren Wahrscheinlichkeiten oft mit double
-Werten zwischen [0..1].
Die Methode nextDouble
der Random
-Klasse erzeugt zufällige double
-Werte. Angenommen, das Wetter folgt diesen Wahrscheinlichkeiten:
- Es besteht eine Wahrscheinlichkeit von 0,1, dass es regnet (10%).
- Es besteht eine Wahrscheinlichkeit von 0,3, dass es schneit (30%).
- Es besteht eine Wahrscheinlichkeit von 0,6, dass die Sonne scheint (60%).
Erstellen wir eine Wettervorhersage mit diesen Wahrscheinlichkeiten:
import java.util.ArrayList;
import java.util.Random;
public class WeatherMan {
private Random random;
public WeatherMan() {
this.random = new Random();
}
public String forecast() {
double probability = this.random.nextDouble();
if (probability <= 0.1) {
return "It rains";
} else if (probability <= 0.4) { // 0.1 + 0.3
return "It snows";
} else { // rest, 1.0 - 0.4 = 0.6
return "The sun shines";
}
}
public int makeAForecast() {
return (int) (4 * this.random.nextGaussian() - 3);
}
}
Die Methode makeAForecast
ist in vielerlei Hinsicht interessant. Der Aufruf this.random.nextGaussian()
ist ein gewöhnlicher Methodenaufruf. Interessant ist jedoch, dass diese Methode der Random
-Klasse eine normalverteilte Zahl zurückgibt (normalverteilte Zahlen können z.B. verwendet werden, um die Größe und das Gewicht von Menschen zu modellieren - wenn Sie sich nicht für verschiedene Arten von Zufälligkeit interessieren, ist das in Ordnung!).
public int makeAForecast() {
return (int) (4 * this.random.nextGaussian() - 3);
}
Im vorherigen Beispiel verwenden wir eine explizite Typumwandlung, um double
-Werte in int
-Werte umzuwandeln (int)
. Genauso können wir int
-Werte in double
-Werte umwandeln, indem wir (double) integer
schreiben.
Fügen wir nun eine main
-Methode hinzu, die die WeatherMan
-Klasse verwendet:
// imports
public class Program {
public static void main(String[] args) {
WeatherMan forecaster = new WeatherMan();
// save days of the week to a list
ArrayList<String> days = new ArrayList<>();
days.add("Mon");
days.add("Tue");
days.add("Wed");
days.add("Thu");
days.add("Fri");
days.add("Sat");
days.add("Sun");
System.out.println("Next week's weather forecast:");
for (String day : days) {
String weatherForecast = forecaster.forecast();
int temperatureForecast = forecaster.makeAForecast();
System.out.println(day + ": " + weatherForecast + " " + temperatureForecast + " degrees.");
}
}
}
Die Programmausgabe könnte wie folgt aussehen:
Next week's weather forecast: Mon: It snows 1 degrees. Tue: It snows 1 degrees. Wed: The sun shines -2 degrees. Thu: The sun shines 0 degrees. Fri: It snows -3 degrees. Sat: It snows -3 degrees. Sun: The sun shines -5 degrees