Part 12

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:

Beispielausgabe

2 2 4 3 4 5 6 0 7 8

Loading

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);
Loading

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:

Beispielausgabe

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

Loading
Sie haben das Ende dieses Abschnitts erreicht! Weiter zum nächsten Abschnitt: