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/b1.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 2 Antworten
Letzter Beitrag: Montag, 17. Dezember 2012 16:57 von maharadja

...einen guten Onlineshop für Taufringe? Ich habe bisher Taufringe Direkt gefunden und wollte mal nachhaken, ob der Shop für Taufringe wirklich so ... » mehr

Webentwickler Konferenz in Hamburg

Hallo Zusammen, Am 20./21. Mai findet in Hamburg die erste Developer Conference 2011 statt. Wie der Name bereits verrät, handelt die Konferenz rund ... » mehr

von devcon-hamburg am Dienstag, 12. April 2011 16:50 in PHP - noch nicht beantwortet

bedingte Weiterleitung in Kontaktformularen

Hallo zusammen, ich habe ein kleines Problem: Ich brauche bei der Entwicklung eines Kontaktformulares für eine Website eine bedingte Weiterleitung ... » mehr

von scatha am Donnerstag, 10. März 2011 01:12 in PHP - noch nicht beantwortet

Gesucht: Auslesen einer externen Website

Mein vorhaben ist recht simpel aber ich bin php noob (hoffe das entschuldigt es nen bissl xD) und hab kp wie ichs anfangen soll. Und zwar möchte ich ... » mehr

von HeathenMan am Dienstag, 1. Februar 2011 22:57 in PHP - bisher 1 Antwort
Letzter Beitrag: Donnerstag, 3. Februar 2011 14:43 von alm

Hallo, am einfachsten und kompaktesten kann man das mit einem regulären Ausdruck machen. Einfach mal nach der Funktion preg_match_all suchen und den ... » mehr

Zeilenumbruch in der Bildergalerie-Beschriftung

Hallo, die Bildergalerie mit php und js ist super, jedoch möchte ich gern zu meinen Bildern verschiedene Bemerkungen machen und zwar untereinander, ... » mehr

von Sylma am Mittwoch, 26. Januar 2011 01:13 in PHP - bisher 1 Antwort
Letzter Beitrag: Freitag, 28. Januar 2011 10:16 von alm

Hallo, ich nehme an, dass \n im Beschreibungstext nicht funktioniert aber versuchen kann man es. Ansonsten: Schon mal mit einer UTF-Sequenz ... » mehr

¬ Tutorials



¬ Insolvenzrecht