rand()
Die Funktion rand() in PHP erzeugt eine pseudo-zufällige ganze Zahl. Hier erfahren Sie Syntax, Anwendungsfälle und wichtige Sicherheitshinweise.
Die Funktion rand() in PHP erzeugt eine pseudo-zufällige ganze Zahl. Dieses Kapitel behandelt die Syntax, wie die optionalen Bereichsargumente funktionieren, den Unterschied zwischen rand() und dem schnelleren mt_rand(), warum Sie keine der beiden Funktionen für sicherheitskritische Zwecke verwenden sollten, sowie praktische Muster wie das Würfeln oder die Auswahl eines zufälligen Array-Elements.
Was die rand()-Funktion macht
rand() ist eine eingebaute PHP-Funktion, die eine zufällige ganze Zahl zurückgibt. Ohne Argumente gibt sie einen Wert zwischen 0 und getrandmax() zurück (den größten Wert, den der Generator erzeugen kann — mindestens 32767). Wenn Sie $min und $max übergeben, gibt sie eine ganze Zahl im inklusiven Bereich $min ≤ n ≤ $max zurück.
Sie erzeugt pseudo-zufällige Zahlen: Werte, die zufällig wirken, aber durch einen deterministischen Algorithmus aus einem internen Seed generiert werden. Das ist für Spiele, Stichproben und Testdaten geeignet, jedoch nicht für Anwendungen, bei denen Vorhersagbarkeit ein Risiko darstellt (siehe Sicherheit unten).
Syntax
rand(): int
rand(int $min, int $max): int| Parameter | Beschreibung |
|---|---|
$min | Optional. Der niedrigste zurückzugebende Wert. Standardmäßig 0. |
$max | Optional. Der höchste zurückzugebende Wert. Standardmäßig getrandmax(). |
$min und $max sind inklusiv, sodass rand(1, 6) 1, 6 oder einen beliebigen Wert dazwischen zurückgeben kann. Wenn Sie $min größer als $max übergeben, wirft PHP 8 einen ValueError.
Grundlegende Verwendung
Hier rufen wir rand() mit einem Bereich auf, speichern das Ergebnis in $result und geben es aus. Führen Sie das Beispiel mehrmals aus, und Sie erhalten jedes Mal eine andere Zahl.
Häufige Anwendungsfälle
Einige Muster, die Sie häufig benötigen werden:
<?php
// 1. Roll a six-sided die
$die = rand(1, 6);
// 2. Pick a random element from an array
$colors = ['red', 'green', 'blue'];
$color = $colors[rand(0, count($colors) - 1)];
// 3. A coin flip
$side = rand(0, 1) === 0 ? 'heads' : 'tails';
echo "Die: $die, Color: $color, Coin: $side";
?>Um ein Array-Element auszuwählen, bietet PHP auch den speziellen Helfer
array_rand(), der klarer ist als die manuelle Berechnung des Index.
rand() vs mt_rand()
mt_rand() verwendet den Mersenne-Twister-Algorithmus. Er ist schneller und hat bessere statistische Eigenschaften als das veraltete rand() und ist daher die bevorzugte Allzweck-Wahl. Beide haben dieselbe Signatur:
<?php
$a = rand(1, 100); // legacy generator
$b = mt_rand(1, 100); // Mersenne Twister — recommended
echo "$a and $b";
?>Seit PHP 7.1 ist rand() intern ein Alias für mt_rand(), sodass sie sich auf modernem PHP identisch verhalten. Bevorzugen Sie mt_rand() in neuem Code der Klarheit halber. Sein Begleiter
mt_getrandmax() gibt den größten Wert an, den er zurückgeben kann.
Seeding
Sie können den Generator mit srand() (oder mt_srand() für mt_rand()) mit einem Seed initialisieren. Das Setzen eines festen Wertes macht die Sequenz reproduzierbar — praktisch für Tests:
<?php
srand(42);
echo rand(1, 100), "\n"; // same output every run for seed 42
?>Seit PHP 4.2 müssen Sie srand() fast nie manuell aufrufen — PHP initialisiert den Generator automatisch bei der ersten Verwendung.
Wann rand() nicht verwendet werden sollte
rand() und mt_rand() sind nicht kryptographisch sicher. Ihre Ausgabe ist vorhersagbar, daher sollten Sie sie niemals für Passwörter, Tokens, Session-IDs, Passwort-Reset-Links oder andere sicherheitskritische Zwecke verwenden. Verwenden Sie dafür einen CSPRNG:
<?php
$secureInt = random_int(1, 100); // cryptographically secure integer
$secureBytes = random_bytes(16); // 16 random bytes
echo $secureInt, ' ', bin2hex($secureBytes);
?>random_int() hat dieselbe (min, max)-Signatur wie rand() und ist daher in der Regel ein direkter Ersatz, wenn Sicherheit eine Rolle spielt.
Zusammenfassung
rand($min, $max)gibt eine pseudo-zufällige ganze Zahl in einem inklusiven Bereich zurück; ohne Argumente reicht der Bereich von0bisgetrandmax().- Bevorzugen Sie
mt_rand()für den allgemeinen Einsatz — er ist schneller und besser verteilt (undrand()ist seit PHP 7.1 ein Alias dafür). - Verwenden Sie
random_int()/random_bytes(), wenn der Wert unvorhersagbar sein muss.
Weitere Informationen zu numerischen Werten und mathematischen Hilfsfunktionen finden Sie unter PHP Numbers und PHP Math.