PHP Rand Function mit Angabe eines Intervalls

Ist die Erzeugung von Zufallswerten nötig, die in einem bestimmten Intervall liegen, so bietet die Funktion rand eine Möglichkeit diesen Intervall anzugeben. Hierzu unterstützt die Funktion rand zwei optionale Parameter, welche die obere sowie die untere Grenze eines gewünschten Zahlenbereichs angibt. Der erste an rand übergebene Wert gibt den Mindestwert, der gegebenenfalls als zweiten Parameter angegebene Wert (beides Integer-Werte) bestimmt den Höchstwert an. Die beiden Grenzwerte werden, falls diese nicht angegeben wurden, mit 0 (als Minimalwert) und RAND_MAX für den Maximalwert vorbelegt.

Dabei ist die Konstante RAND_MAX vom verwendeten Betriebssytem abhängig (auf Windows-Systemen ist RAND_MAX meist mit dem Wert 32768 belegt). Wie hoch – oder auch wie niedrig – dieser Wert ist, kann mit der Funktion getrandmax ermittelt werden. Durch Angabe eines Intervalls kann auch die Banner-Rotation aus dem letzten Beispiel mit einem Aufruf von in der Form rand (0, sizeof ($banners) - 1) umgesetzt werden. Folgendes Beispiel gibt wiederum Zufallszahlen mit echo aus, wobei verschiedene Grenzwerte bei der Erzeugung berücksichtigt werden.

<?php
    // Maximaler Wert, der durch rand geliefert wird
    echo 'RAND_MAX: ' . getrandmax () . '<br>';

    // Generator mit einem Seed initialisieren (Systemzeit des Webservers)
    srand (time ());
    // Erzeugen von Zufallswerten, die direkt ausgegeben werden.
    // Als Wertebereich werden Zahlen von 0 bis 255 gewählt.
    echo 'Zufallswerte zwischen 0 und 255: ';
    for ($i = 0; $i < 10; $i++)
        echo rand (0, 255) . ' ';
    // HTML-Code für einen Zeilenumbruch ansgeben
    echo '<br>';

    // Ausgabe von Zahlenwerten zwischen 1 und 5
    echo 'Zufallswerte zwischen 1 und 5: ';
    for ($i = 0; $i < 10; $i++)
        echo rand (1, 5) . ' ';
?>

RAND_MAX: 2147483647
Zufallswerte zwischen 0 und 255: 82 97 111 151 197 185 225 87 24 97
Zufallswerte zwischen 1 und 5: 2 2 1 3 2 4 2 5 2 2

mt_rand und mt_srand als Alternative zu rand und srand

Aufgrund der Tatsache, dass die Erzeugung von Pseudozufallszahlen mittels der Funktion rand die vom Betriebssystem implementierten Funktionen zur Erzeugung dieser Zufallswerte nutzt, ist deren Qualität nicht unbedingt optimal. Dies hat im Wesentlichen zwei Gründe: Zum Einen liefert die Systemfunktion ihre Zufallszahlen mit einer recht geringen Periodenlänge – was an der hinter dem Generator steckenden Funktion zur Berechnung der Folgewerte liegt. Zum Anderen ist die Verteilungscharakteristik – ein guter Zufallszahlengenerator soll möglichst gleichverteilte Zufallswerte liefern – der durch das Betriebssystem implementierten Funktionen nicht besonders gut.

Um die Qualität der Zufallszahlen (bessere Streuung bzw. Verteilung) zu verbessern, bietet sich die Funktion mt_rand an. Durch deren Nutzung kommt auch ein weiterer Aspekt bei der Bewertung eines Zufallszahlengenerators, das Laufzeitverhalten des Generators, zur Geltung. Auf vielen Systemen läuft der Zufallszahlengenerator des Betriebssystems deutlich langsamer als die Funktion mt_rand. Diese liefert ihre Werte zum Teil viermal schneller als die Funktion rand. Bei modernen Betriebssystemen (beispielsweise aktuellen Linux-Systemen) entfällt der genannte Geschwindigkeitsvorteil, da diese Systeme mittlerweile ebenfalls modernere Zufallszahlengeneratoren einsetzen und über Systemfunktionen zur Verfügung stellen. Im nächsten Beispiel werden wiederum Zufallszahlen nach deren Konvertierung in ein String unter Verwendung von echo im Browserfenster ausgegeben.

<?php
    // Maximaler Wert für Zufallszahlen von mt_rand
    echo 'RAND_MAX bei Nutzung von mt_rand: ' . mt_getrandmax () . '<br>';

    // Auch hier wird der Generator initialisiert
    mt_srand (time ());
    // Zufallszahlen aus 0 bis RAND_MAX erzeugen
    echo 'Zufallswerte zwischen 0 und RAND_MAX: ';
    for ($i = 0; $i < 10; $i++)
        echo mt_rand () . ' ';
    // Zeilenumbruch für die Browserausgabe erzeugen
    echo '<br>';

    // Ausgabe von Zufallswerten zwischen 0 und 9
    echo 'Zufallswerte zwischen 0 und 9: ';
    for ($i = 0; $i < 10; $i++)
        echo mt_rand (0, 9) . ' ';
?>

RAND_MAX bei Nutzung von mt_rand: 2147483647
Zufallswerte zwischen 0 und RAND_MAX: 1336130850 285052828 2124116202 1578447056 2006029320 283329318 867741916 706512631 473408816 471470492
Zufallswerte zwischen 0 und 9: 7 5 8 9 3 2 8 9 2 6

¬ Tutorials



¬ Insolvenzrecht