# 4.10.7 Zufallsgenerierter Inhalt

Oftmals sind mehr Informationen vorhanden, als „Platz“ auf der Startseite. Wenn aus einer festen Anzahl von Bildern oder Texten ausgewählt werden soll, so bietet sich folgende Funktionalität an.

Beispiel

Bilder oder Texte zufällig auf die Webseite stellen

    1
    2
    3
    <?php
    $numbers = mt_rand(1, 3);
    echo "<img src='datei{$numbers}.png'>";

## Zufallsfunktionen

Funktion | Erklärung
--- | ---
mt_srand() | Legt einen internen Startwert für einen Zufallsgenerator mit `mt_rand()` fest. Diese Werte werden über die aktuelle Uhrzeit festgelegt, da gleiche Startwerte sonst zu Pseudo-Zufallssequenzen führen.
mt_rand() | Erzeugt „bessere“ Zufallszahlen. Für die bereitgestellten Funktionen bietet `mt_rand()` einen Drop-In Ersatz. Es benutzt einen Zufallsgenerator.

Ein weiteres Beispiel ist ein Lottozahlen-Generator. Dieser erzeugt sechs unterschiedliche, zufällige Zahlen zwischen 1 und 49. Der Code wird in der folgenden Abbildung gezeigt.

Code

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <?php
    for ($number = 1; $number <= 49; $number++) {
        $numbers[] = $number;
    }
    for ($quantity = 1; $quantity <= 6; $quantity++) {
        $key = mt_rand(0, count($numbers) - 1);
        $drawnNumbers[] = $numbers[$key];
        unset($numbers[$key]);
        $numbers = array_values($numbers);
    }
    sort($drawnNumbers);
    foreach ($drawnNumbers as $number) {
        echo "$number <br>\r\n";
    }

Das Problem bei einem Lottozahlen-Generator ist, dass die Zahlen nur einmal vorkommen sollen und das natürlich bei gleicher Wahrscheinlichkeit. Deswegen verwendet man ein Array, welches man mit den möglichen Werten füllt (Zeilen 1 bis 3).

Anschließend werden sechs Zahlen gezogen. Dabei wird zufällig ein Array-Schlüssel ermittelt (Zeile 5) und der zugehörige Wert in ein neues Array geschrieben (Zeile 6). Anschließend wird die gezogene Zahl aus dem Zahlenvorrat entfernt, da sie bereits gezogen wird (Zeile 7). Da sich nun allerdings die hinteren Schlüssel des Arrays nicht geändert haben, muss das Array neu aufgebaut werden, was in Zeile 8 durch die Funktion `array_values()` realisiert wird.

In Zeile 10 erfolgt eine aufsteigende Sortierung der gezogenen Zahlen, bis sie schließlich in Zeile 12 wieder ausgegeben werden.

Aufgabe Lottozahlen-Generator

Der Lottozahlen-Generator kann vereinfacht werden. Finden Sie eine Funktion, die die Zeilen 4 bis 10 kombiniert und nur eine einfache Änderung in der Zeile 12 bedarf.

Lösung

Die Funktion `array_rand()` kombiniert die Zeilen 4 bis 10 zu einer zusammen:

    <?php
    $drawnNumbers = array_rand($numbers, 6);

Die Änderung der Zeile 12 ist dann wie folgt:

    <?php
    echo $numbers[$number] . "<br>";