Start · Sprachen · PHP · Referenz · mt_rand

mt_rand

Funktion

Erzeugt eine pseudozufällige Ganzzahl nach dem Mersenne-Twister-Algorithmus im angegebenen Bereich.

seit PHP 4.0.0 Kategorie: crypto

Signatur

mt_rand(int $min = 0, int $max = MT_RAND_MAX): int

Beschreibung

mt_rand() erzeugt eine pseudozufällige Ganzzahl auf Basis des Mersenne-Twister-Algorithmus (MT19937). Dieser ist etwa viermal schneller als der ältere rand()-Algorithmus und liefert eine bessere statistische Verteilung der Zufallszahlen. Ohne Argumente wird eine Zahl zwischen 0 und MT_RAND_MAX zurückgegeben.

Typische Anwendungsfälle sind die Erzeugung von Zufallszahlen für Spiele, zufällige Sortierungen, Test-Fixtures oder die Auswahl zufälliger Elemente aus einer Menge. Mit den Parametern $min und $max lässt sich der gewünschte Wertebereich präzise eingrenzen.

Wichtig für sicherheitskritische Anwendungen: Obwohl Mersenne-Twister deutlich besser als rand() ist, handelt es sich um einen deterministischen Pseudozufallsgenerator. Der interne Zustand kann nach ausreichend vielen Ausgaben rekonstruiert werden. Für kryptografische Zwecke (Tokens, Passwörter, Session-IDs) muss stattdessen random_int() verwendet werden.

Seit PHP 7.1.0 nutzt mt_rand() intern die korrigierte Version des Mersenne-Twister-Algorithmus. Das frühere (fehlerhafte) Verhalten kann mit mt_srand(seed, MT_RAND_PHP) reproduziert werden.

Parameter

Name Typ Default Beschreibung
$min int 0 Kleinster gewünschter Rückgabewert (inklusiv). Muss kleiner oder gleich $max sein.
$max int MT_RAND_MAX Größter gewünschter Rückgabewert (inklusiv). Darf den Wert MT_RAND_MAX nicht überschreiten.

Rückgabewert

Typ
int
Beschreibung
Gibt eine pseudozufällige Ganzzahl zwischen $min und $max zurück (beide Grenzen eingeschlossen). Wirft einen ValueError, wenn $min größer als $max ist (seit PHP 8.0; davor wurde false zurückgegeben und ein E_WARNING ausgelöst).

Beispiele

Zufallszahl in einem bestimmten Bereich erzeugen

<?php
// Simuliert einen Würfelwurf (1–6)
$wurf = mt_rand(1, 6);
echo "Würfelwurf: " . $wurf . PHP_EOL;

// Zufällige Prozentzahl
$prozent = mt_rand(0, 100);
echo "Zufälliger Prozentwert: " . $prozent . "%" . PHP_EOL;
Würfelwurf: 4 Zufälliger Prozentwert: 73%

Reproduzierbares Ergebnis mit festem Seed (mt_srand)

<?php
// Durch festen Seed wird die Zufallsfolge reproduzierbar — nützlich für Tests
mt_srand(42);
for ($i = 0; $i < 5; $i++) {
    echo mt_rand(1, 100) . PHP_EOL;
}
2 90 16 73 38

Zufälliges Element aus einem Array auswählen

<?php
$farben = ['Rot', 'Grün', 'Blau', 'Gelb', 'Lila'];
$index = mt_rand(0, count($farben) - 1);
echo "Zufällige Farbe: " . $farben[$index] . PHP_EOL;
Zufällige Farbe: Blau

// Wichtig · Fallstricke

Sicherheitswarnung: mt_rand() ist nicht kryptografisch sicher. Der Mersenne-Twister-Algorithmus ist deterministisch und sein Zustand kann bei ausreichender Beobachtung der Ausgaben rekonstruiert werden. Für sicherheitskritische Anwendungen wie die Erzeugung von Passwörtern, Tokens, CSRF-Schutz oder Session-IDs muss random_int() verwendet werden.

Seit PHP 7.1.0 wurde ein Fehler in der ursprünglichen MT19937-Implementierung korrigiert. Skripte, die auf das alte (fehlerhafte) Verhalten angewiesen sind, können mt_srand(seed, MT_RAND_PHP) nutzen, um es zu emulieren — dies sollte jedoch vermieden werden.

Wenn $min größer als $max übergeben wird, löst PHP 8.0+ einen ValueError aus. In älteren Versionen wurde lediglich ein E_WARNING generiert und false zurückgegeben.