Random in PHP – Erzeugung von Zufallszahlen

Ab und an werden – beispielsweise, wenn es um das Generieren einer eindeutigen Session-ID geht – zufällige Werte benötigt. Unter PHP übernimmt diese Aufgabe die Funktion rand. Sie liefert eine Zufallszahl – genauer gesagt eine Pseudo-Zufallszahl, da es keine echten softwaregenerierten Zufallszahlen gibt – die vom Programmierer in Folge in seinem Code verwendet werden kann. Hinter rand steht ein sogenannter Zufallszahlengenerator, der nichts anderes macht, als die Zahlen einer berechenbaren Folge zu errechnen und entsprechend zurückzuliefern. Der Generator hat einen Zustand aufgrund dessen er den nächsten Wert der Folge berechnet, wobei nach jedem gelieferten Wert der Zustand angepasst wird.

Beachten Sie bitte, dass bei der Erzeugung von Session-IDs nicht allein auf einen Zufallswert gesetzt werden sollte. Bei einer gut besuchten Website reicht dies nicht aus und Sie sollten die Zufallszahl lediglich als Komponente zur Erzeugung der Session-ID nutzen. Nutzen Sie in einem solchen Anwendungsfall eher md5-Hashes, die durch die Funktion md5 geliefert und mit einem zufällig erzeugten String gefüttert wird. Das String kann unter Verwendung der Funktion uniqid erzeugt werden.

Wie bereits erwähnt, werden nicht wirklich Zufallswerte berechnet (der Zufall läßt sich naturgemäß nicht berechnen), sondern die jeweils gemäß dem Zustand des Generators folgende Pseudo-Zufallszahl. Bevor der Zufallszahlengenerator genutzt werden kann, muss er zunächst mit einem Startwert – dem sogenannten Seed – initialisiert werden, was mit einem Aufruf der Funktion srand geschieht. Zwar wird dies seit PHP 4.2.0 beim ersten Aufruf von rand automatisch erledigt, aber zur Sicherheit sollte der Aufruf dennoch erfolgen, da man sich nicht sicher sein kann, dass auf jedem System, auf dem ein Script eingesetzt wird auch eine neuere PHP Version läuft. Als Seed wird meist die Systemzeit des Webservers (in Millisekunden; geliefert durch einen Aufruf der Funktion time) verwendet, wobei davon ausgegangen wird, dass diese bei jedem Request an den Server unterschiedlich ist.

Dies ist übrigens wichtig, da ein Zufallszahlengenerator bei gleichem Wert zur Initialisierung auch stets die gleiche Zahlenfolge liefert, was im folgenden Beispiel demonstriert wird. Beachten Sie, dass die Nutzung der Funktionen mt_srand und mt_rand Zufallswerte von erheblich besserer Qualität liefern. Auf der Folgeseite werden auch Beispiele zur Nutzung dieser Funktionen beschrieben.

<?php
// Aktuelle Systemzeit holen
$t = time ();
// Initialisierung des Zufallszahlengenerators
srand ($t);
// Zehn Zufallswerte ausgeben
echo "Zufallswerte 1:<br>";
for ($i = 0; $i < 10; $i++)
    echo rand () . ' ';
echo '<br>';

// Mal sehen, welche Werte der Zufall diesmal liefert
srand ($t);
echo "Zufallswerte 2:<br>";
for ($i = 0; $i < 10; $i++)
    echo rand () . ' ';
echo '<br>';
?>

Zufallswerte 1:
324136340 1422639377 1196215534 326752739 1311286077 1632654059 1257252014 1393993497 994876053 1995470329
Zufallswerte 2:
324136340 1422639377 1196215534 326752739 1311286077 1632654059 1257252014 1393993497 994876053 1995470329

PHP Randomize: Zufällige Bannerrotation (Random Image)

Das Beispiel zeigt, dass man sich nie auf den Zufall verlassen sollte, wenn der Webserver besonders flink ist und die Internetseite darüber hinaus gut besucht wird. Wird das Script nämlich zur selben Zeit von zwei Besuchern gleichzeitig ausgeführt, dann erhalten auch beide die gleiche Zufallszahl. Je nach Anwendung kann dies zu komplikationen führen, die den Betrieb stören. Folgendes Beispiel zeigt eine einfache Banner-Rotation, die mittels Zufallszahlen gesteuert wird – ein eher unkritischer Anwendungsfall. Hier wird ein Array verwendet, in dem die URLs zu alternativ anzuzeigenden Bannergrafiken abgelegt sind. Die Ausgabe des HTML-Codes zur Anzeige des entsprechenden Banners erfolgt auch hier wieder mit echo.

<?php
// Zufallszahlengenerator initialisieren
srand (time ());
// Liste der zur Wahl stehenden Banner bzw. deren URLs
$banners = array ("/banner/b1.gif", "/banner/b2.gif", "/banner/b3.gif", "/banner/b4.gif");
// Mittels Modulo-Operator (%) wird der beim ganzzahligen Teilen verbleibende Rest ermittelt.
// Hierdurch wird der Bereich der möglichen Werte auf 0-3 begrenzt, damit keine ungültigen
// Indexe beim Zugriff auf das Array mit den Banner-URLs entstehen.
$banner = rand () % (sizeof ($banners) - 1);
// Banner an zufällig gewähltem Index im HTML-Code der Ergebnisseite einbauen
echo '<img src="' . $banners[$banner] . '" title="Banner"/>';
?>

<img src="/banner/b3.gif" title="Banner"/>

¬ Tutorials



¬ Insolvenzrecht