Start · Sprachen · PHP · Referenz · mt_srand

mt_srand

Funktion

Initialisiert den Mersenne-Twister-Zufallszahlengenerator mit einem optionalen Seed-Wert.

seit PHP 3.0.6 Kategorie: crypto

Signatur

mt_srand(int $seed = 0, int $mode = MT_RAND_MT19937): void

Beschreibung

mt_srand() setzt den internen Startwert (Seed) des Mersenne-Twister-Algorithmus, der von mt_rand() verwendet wird. Wird kein Seed angegeben, verwendet PHP seit Version 7.1 automatisch einen kryptographisch zufälligen Seed. Für reproduzierbare Zufallssequenzen – z. B. in Tests oder Spielsimulationen – kann ein fester Seed gesetzt werden.

Der Mersenne-Twister gilt als schnell und erzeugt eine gleichmäßige Verteilung, ist aber nicht kryptographisch sicher. Für sicherheitsrelevante Anwendungen wie Token-Generierung oder Passwörter sollte stattdessen random_bytes() oder random_int() verwendet werden.

Ab PHP 7.1 gibt es zwei Modi: MT_RAND_MT19937 (korrekte Implementierung, Standard) und MT_RAND_PHP (Kompatibilitätsmodus mit der fehlerhaften Implementierung aus älteren PHP-Versionen). Der MT_RAND_PHP-Modus ist seit PHP 8.3 als veraltet markiert.

Wird mt_srand() mehrfach mit demselben Seed aufgerufen, beginnt die Sequenz von mt_rand() jedes Mal von vorne – was in bestimmten Angriffszenarien ausgenutzt werden kann.

Parameter

Name Typ Default Beschreibung
$seed int 0 Der Startwert (Seed) für den Zufallszahlengenerator. Wird kein Wert angegeben oder null übergeben, wird seit PHP 7.1 automatisch ein zufälliger Seed gesetzt.
$mode int MT_RAND_MT19937 Legt den Algorithmus-Modus fest. MT_RAND_MT19937 (Standard) verwendet die korrekte Implementierung; MT_RAND_PHP emuliert das fehlerhafte Verhalten älterer PHP-Versionen und ist seit PHP 8.3 veraltet.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Reproduzierbare Zufallssequenz mit festem Seed

<?php
// Immer denselben Seed setzen, um reproduzierbare Ergebnisse zu erhalten
mt_srand(42);
echo mt_rand(1, 100) . PHP_EOL; // Ergibt stets denselben Wert
echo mt_rand(1, 100) . PHP_EOL;
echo mt_rand(1, 100) . PHP_EOL;

// Sequenz neu starten
mt_srand(42);
echo mt_rand(1, 100) . PHP_EOL; // Dieselbe erste Zahl wie oben
68 13 57 68

Automatischer Seed (empfohlene Standardverwendung)

<?php
// Seit PHP 7.1: Kein Seed-Argument nötig – PHP wählt automatisch einen zufälligen Seed
mt_srand();
$zufallszahl = mt_rand(1000, 9999);
echo 'Zufällige vierstellige Zahl: ' . $zufallszahl . PHP_EOL;

// Hinweis: Für sicherheitskritische Zwecke lieber random_int() verwenden
$sichereZahl = random_int(1000, 9999);
echo 'Sichere Zufallszahl: ' . $sichereZahl . PHP_EOL;
Zufällige vierstellige Zahl: 4271 Sichere Zufallszahl: 7832

// Wichtig · Fallstricke

Sicherheitswarnung: mt_srand() und mt_rand() sind nicht kryptographisch sicher. Da der Mersenne-Twister deterministisch ist, kann ein Angreifer, der mehrere aufeinanderfolgende Ausgaben kennt, den Seed rekonstruieren und alle zukünftigen Werte vorhersagen. Für Passwörter, Tokens, Session-IDs oder andere sicherheitsrelevante Zufallswerte müssen random_int() bzw. random_bytes() verwendet werden.

Der Modus MT_RAND_PHP ist seit PHP 8.3 als veraltet (deprecated) markiert und sollte nicht mehr in neuem Code verwendet werden. Er existiert nur für die Rückwärtskompatibilität mit altem Code, der auf die fehlerhafte Implementierung angewiesen ist.

Seit PHP 7.1 wird der Seed automatisch gesetzt, falls mt_srand() vor dem ersten Aufruf von mt_rand() nicht explizit aufgerufen wird. Ein manueller Aufruf ohne Argument ist daher in den meisten Fällen nicht nötig.