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"/>

Letzte Posts aus unserem Forum

Wer kennt .....

Hallo erstmal wer kennt von euch einen WEbprogrammieren,desginer der mir eine Seite erstellen kann ,Communityportal sowas in der art wie ... » mehr

von NCWebmaster am Mittwoch, 7. Oktober 2009 00:32 in PHP - bisher 1 Antwort
Letzter Beitrag: Mittwoch, 7. Oktober 2009 13:26 von kalle

Hallo auch, da gibt es sicher viele die das machen würden, allerdings deutlich weniger die es auch tatsächlich machen könnten - noch einmal weniger ... » mehr

oh Mann

Hallo erstmals..... also ich kenn mich ja nicht so aus, aber ich denke die Menschheit fliegt auf den Mond, dann müsste es auch eine Lösung für mein ... » mehr

von Dummbazz am Dienstag, 24. Februar 2009 15:11 in PHP - bisher 2 Antworten
Letzter Beitrag: Mittwoch, 25. Februar 2009 11:48 von Dummbazz

Danke für die aufmunternde Worte... ... » mehr

counter auch ohne datenbank?

tach auch, ich habe nach einem besucherzähler gesucht, der auf meiner seite anzeigt, wieviele besucher sich dort aufhalten. allerdings habe ich ... » mehr

von marcel am Montag, 8. Dezember 2008 12:21 in PHP - bisher 1 Antwort
Letzter Beitrag: Montag, 8. Dezember 2008 13:34 von alm

Hallo, sicher kann die Counter-Klasse so umgeschrieben werden, dass sie auch ohne Datenbankanbindung funktioniert. Allerdings würde das einer neuen ... » mehr

DAten speichern und abfragen

Hallo an Alle! Hoffe, dass ich hier im richtigen Forum bin. Vielleicht kann mir jemand einen Tip geben. Ich möchte auf meiner Webpage ein Formular ... » mehr

von muenchner am Samstag, 12. Juli 2008 18:31 in PHP - bisher 1 Antwort
Letzter Beitrag: Montag, 14. Juli 2008 08:49 von alm

Hallo, ich bin mir nicht sicher, wie das jetzt gemeint ist! Geht es um die Frage: Sollen die Optionen des Forumlars (die einzelnen Checkboxen) in ... » mehr

Tutorials :: PHP & MySQL - Problem

Hi, zunächsteinmal danke für das Tutorial: ... » mehr

von migges am Montag, 2. Juni 2008 12:05 in PHP - bisher 3 Antworten
Letzter Beitrag: Dienstag, 3. Juni 2008 11:45 von alm

Das mit den Oder-Operatoren wundert mich ein wenig... Welchen Fehler hat der Interpreter an diesen Stellen ausgegeben? Ich habe bislang mit ... » mehr

¬ Tutorials



¬ Insolvenzrecht