Hi,

Zufallszahlen kann man für verschiedene Dinge gebrauchen - zum Generieren von Passwörtern oder für ein Zahlenraten-Spiel. Außerdem gibt es sie in fast allen Programmiersprachen. Schauen wir uns an wie das in PHP funktioniert.

<h3>Wie generiert man Zufallszahlen?</h3>

Dafür gibt es eine Funktion rand, an die können wir einen Minimum- und Maximumwert übergeben, innerhalb derer die Zufallszahl generiert wird. Wenn wir eine Zahl zwischen 50 und 100 haben wollen, übergeben wir somit 50 und 100. Wenn wir die Funktion rand() ganz ohne Argumente aufrufen, erhalten wir einen Wert zwischen 0 und getrandmax (das liefert dir die maximale Zahl die PHP vorgibt um Zufallszahlen zu erzeugen).

Aber schau selbst:

<pre class="lang:default decode:true">&lt;?php # Gibt eine Zufallszahl zwischen 50 und 100 aus echo rand(50, 100); ?&gt;</pre>

Die Zahlen werden jeweils einschließlich des angegebenen Bereichs generiert, das heißt die Zufallszahl kann 50, 100 oder irgendwas dazwischen sein.

Machen wir etwas sinnvolles damit:

<h3>Simpler Passwortgenerator</h3>

Wir programmieren einen kleinen Passwortgenerator, der uns ein Passwort mit 8 Zeichen Länge ausspuckt. Der Code:

<pre class="lang:default decode:true">&lt;?php # Das Passwort kann folgende Zeichen enthalten $Zeichen = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789?%!$"; # Die Passwortlänge festlegen $Laenge = 8; # $Passwort wird nachher das Passwort enthalten $Passwort = ""; # Eine Schleife von 0 bis 7 (sind dann also 8 Durchläufe - somit 8 Zeichen Länge) for ($i = 0; $i &lt; $Laenge; $i++) { $Zufallszeichen = substr($Zeichen, rand(0, strlen($Zeichen) - 1), 1); $Passwort .= $Zufallszeichen; } # Das Passwort ausgeben: echo "Das Passwort ist &lt;strong&gt;" . $Passwort . "&lt;/strong&gt;"; ?&gt;</pre>

Zur Erklärung:

<ul> <li>Wir legen erstmal fest, welche Zeichen das Passwort später überhaupt enthalten kann sowie die Länge des Passworts und eine Variable in die wir das Passwort dann speichern.</li> <li>In einer for-Schleife zählen wir von 0 an immer eins hoch solange der Zähler kleiner als $Laenge ist.</li> <li>Ein zufälliges Zeichen holen wir mit uns mit der schon bekannten Funktion substr.  Das heißt wir übergeben wieder den String aus dem wir ein Zeichen extrahieren wollen, springen dort an einen zufälligen Index (mit rand eine Zahl von 0 bis Anzahl-Zeichen-des-Strings-minus-eins) und extrahieren von dort an 1 Zeichen.</li> </ul>

Spiele einfach mal mit den Werten herum und schau, was dabei raus kommt :)

<h3>Zufälligen Wert aus einem Array holen</h3>

Erstellen wir ein Array und geben danach einen zufälligen Eintrag aus.

<pre class="lang:default decode:true ">&lt;?php $Zahlen = [ 'Eins', 'Zwei', 'Drei', 'Vier', 'Fünf', 'Sechs', 'Sieben', ]; $Zufallsindex = rand(0, count($Zahlen) - 1); echo $Zahlen[$Zufallsindex]; ?&gt;</pre>

Sehr einfaches Beispiel, aber es funktioniert. Bei jedem Neuladen der Seite (drück' [F5]) wird etwas anderes ausgegeben. Mit count ermitteln wir die Anzahl von Werten die das Array enthält und ziehen dann 1 ab.

Vielleicht fragst du dich, wieso wir mit count die Array-Größe ermitteln und dann wieder 1 abziehen (so wie im Code-Beispiel zuvor bei strlen). Nun, wir haben hier ein Array mit 7 Einträgen, das heißt es gibt $Zahlen[0] bis $Zahlen[6]. Die Funktion count gibt uns logischerweise 7 zurück. Wenn wir demnach rand(0, 7) schreiben kann die Zufallszahl eine Zahl von einschließlich 0 bis einschließlich 7 sein. $Zahlen[7] gibt's aber nicht. Deswegen ziehen wir 1 ab.

<h3>Sind die generierten Zahlen wirklich zufällig?</h3>

Nicht so ganz, daher spricht man bei den von rand() erzeugten Werten auch von Pseudo-Zufallszahlen. Es gibt aber noch die Funktion mt_rand, die "bessere" Zufallszahlen erzeugt, und das auch noch wesentlich schneller.

» Ich empfehle dir für den weiteren Verlauf immer nur mt_rand zu verwenden. Die oben gezeigten Beispiele funktionieren ganz genauso.

<h3>Zufallszahl mit Nachkommastellen</h3>

Auch das geht, indem du eine Zufallszahl generierst und sie durch den Zufallszahl-Maximalwert teilst:

<pre class="lang:default decode:true ">&lt;?php echo mt_rand() / mt_getrandmax(); ?&gt;</pre>

Die Ausgabe kann so aussehen:

<pre class="lang:default highlight:0 decode:true ">0.57965220863915</pre>

<h3>Fazit</h3>

Woah, wir sind schon am Ende - ging schnell heute, aber mehr ist zu Zufallszahlen einfach nicht zu sagen. Trotzdem wirst du sie öfter benötigen als du vielleicht jetzt glaubst.

Bis zum nächsten Artikel Marius