Start · Sprachen · PHP · Referenz · srand

srand

Funktion

Legt den Anfangswert (Seed) für den Zufallszahlengenerator fest, der von <code>rand()</code> und <code>mt_rand()</code> verwendet wird.

seit PHP 4.0.0 Kategorie: crypto

Signatur

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

Beschreibung

srand() initialisiert den internen Zufallszahlengenerator mit einem festen Startwert (Seed). Dadurch wird die Sequenz der von rand() erzeugten Pseudozufallszahlen reproduzierbar: Gleicher Seed → gleiche Zahlenfolge. Das ist nützlich für Tests, Simulationen und deterministische Algorithmen.

Seit PHP 7.1 teilen sich srand() und mt_srand() denselben internen Zustand – ein Aufruf von srand() beeinflusst also auch Ergebnisse von mt_rand() und umgekehrt. Der Parameter $mode erlaubt die Wahl zwischen dem Mersenne-Twister-Algorithmus (MT_RAND_MT19937, Standard) und dem älteren, fehlerbehafteten Modus (MT_RAND_PHP).

Wird srand() ohne Argument aufgerufen oder der Seed weggelassen, wählt PHP einen zufälligen Startwert automatisch. In den meisten Produktionsanwendungen ist ein expliziter Aufruf von srand() daher unnötig – PHP seeded den Generator beim Start selbstständig.

Sicherheitshinweis: srand() und rand() sind nicht kryptografisch sicher. Für Passwörter, Tokens oder sicherheitsrelevante Zufallswerte muss stattdessen random_bytes() oder random_int() verwendet werden.

Parameter

Name Typ Default Beschreibung
$seed int 0 Der ganzzahlige Startwert für den Zufallsgenerator. Bei gleichem Seed wird stets dieselbe Zahlenfolge erzeugt. Wird der Parameter weggelassen, wählt PHP einen zufälligen Seed.
$mode int MT_RAND_MT19937 Wählt den Algorithmus: MT_RAND_MT19937 (korrekter Mersenne Twister, Standard seit PHP 7.1) oder MT_RAND_PHP (veralteter, fehlerhafter Modus für Rückwärtskompatibilität).

Rückgabewert

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

Beispiele

Reproduzierbare Zufallsfolge mit festem Seed

<?php
// Gleicher Seed ergibt stets dieselbe Zahlenfolge
srand(42);
echo rand(1, 100) . PHP_EOL; // z. B. 85
echo rand(1, 100) . PHP_EOL; // z. B. 71
echo rand(1, 100) . PHP_EOL; // z. B. 10

// Erneutes Seeden mit demselben Wert resettet die Folge
srand(42);
echo rand(1, 100) . PHP_EOL; // wieder 85
85 71 10 85

Simulation mit deterministischem Seed (Unit-Test-tauglich)

<?php
function simuliereWuerfelwuerfe(int $anzahl, int $seed): array {
    srand($seed);
    $ergebnisse = [];
    for ($i = 0; $i < $anzahl; $i++) {
        $ergebnisse[] = rand(1, 6);
    }
    return $ergebnisse;
}

$wuerfe = simuliereWuerfelwuerfe(5, 1234);
echo implode(', ', $wuerfe) . PHP_EOL;
// Immer dieselbe Ausgabe für Seed 1234
3, 6, 3, 5, 2

Sicherheitshinweis: kryptografisch sichere Alternative

<?php
// FALSCH für sicherheitsrelevante Zwecke:
srand();
$unsichererToken = rand(100000, 999999);

// RICHTIG – kryptografisch sicherer Zufallswert:
$sichererToken = random_int(100000, 999999);
echo $sichererToken . PHP_EOL;

// Oder als Byte-String für Tokens:
$token = bin2hex(random_bytes(16));
echo $token . PHP_EOL;

// Wichtig · Fallstricke

Sicherheit: srand() und rand() erzeugen Pseudozufallszahlen, die bei bekanntem oder erratbarem Seed vollständig vorhersagbar sind. Sie dürfen niemals für kryptografische Zwecke (Passwörter, Session-Tokens, Einmal-Codes, Schlüssel etc.) eingesetzt werden. Verwende stattdessen random_int() oder random_bytes().

PHP 7.1+: srand() und mt_srand() benutzen denselben internen Zustand. Ein Aufruf beeinflusst beide Funktionen. Außerdem wurde der Standard-Modus auf den korrekten Mersenne-Twister geändert; MT_RAND_PHP liefert aus Kompatibilitätsgründen weiterhin das alte (fehlerhafte) Verhalten.

Automatisches Seeding: PHP seeded den Zufallsgenerator beim Scriptstart automatisch. Ein expliziter Aufruf von srand() ist nur dann sinnvoll, wenn eine reproduzierbare Sequenz gewünscht ist.