Start · Sprachen · PHP · Referenz · Random\Engine\Mt19937

Random\Engine\Mt19937

Klasse

Implementiert den Mersenne-Twister-Algorithmus (MT19937) als <code>Random\Engine</code> für die objektorientierte Zufallszahlenerzeugung.

seit PHP 8.2.0 Kategorie: crypto

Signatur

class Random\Engine\Mt19937 implements Random\Engine

Beschreibung

Random\Engine\Mt19937 ist eine Implementierung des weit verbreiteten Mersenne-Twister-Algorithmus (MT19937) als Teil des in PHP 8.2 eingeführten objektorientierten Zufallszahlensystems. Das Objekt kann als Engine für die Klasse Random\Randomizer verwendet werden, um reproduzierbare oder nicht-reproduzierbare Pseudozufallszahlen zu erzeugen.

Der Mersenne Twister hat eine sehr lange Periode von 219937−1 und ist damit für statistische Simulationen und allgemeine Zufallsanwendungen gut geeignet. Er ist jedoch nicht kryptografisch sicher: Aus einer ausreichenden Anzahl von Ausgaben kann der innere Zustand rekonstruiert werden. Für sicherheitsrelevante Anwendungen sollte stattdessen Random\Engine\Secure verwendet werden.

Die Klasse unterstützt zwei Modi, die den Modi der Legacy-Funktion mt_rand() entsprechen: MT_RAND_MT19937 (korrekter Algorithmus) und MT_RAND_PHP (historisch fehlerhafte PHP-Variante, nur für Rückwärtskompatibilität). Mit einem festen Seed liefert die Engine deterministisches, reproduzierbares Verhalten, was etwa für Tests oder Spielmechaniken nützlich ist.

Die Engine implementiert das Interface Random\Engine und kann damit nahtlos mit Random\Randomizer kombiniert werden, der höherstufige Methoden wie getInt(), shuffleArray() oder pickArrayKeys() bereitstellt.

Parameter

Name Typ Default Beschreibung
$seed int|null null Startwert (Seed) für den Zufallsgenerator. Bei null wird ein zufälliger Seed aus einer sicheren Quelle gewählt. Ein fester int-Wert liefert reproduzierbare Ergebnisse.
$mode int MT_RAND_MT19937 Gibt den Kompatibilitätsmodus an. MT_RAND_MT19937 verwendet den korrekten Algorithmus; MT_RAND_PHP emuliert das fehlerhafte Verhalten älterer PHP-Versionen (nur für Rückwärtskompatibilität).

Rückgabewert

Typ

Beispiele

Reproduzierbare Zufallszahlen mit festem Seed

<?php
$engine = new Random\Engine\Mt19937(seed: 42);
$randomizer = new Random\Randomizer(engine: $engine);

echo $randomizer->getInt(1, 100) . PHP_EOL;
echo $randomizer->getInt(1, 100) . PHP_EOL;

// Gleiches Ergebnis bei erneutem Durchlauf mit Seed 42
$engine2 = new Random\Engine\Mt19937(seed: 42);
$randomizer2 = new Random\Randomizer(engine: $engine2);

echo $randomizer2->getInt(1, 100) . PHP_EOL; // Gleicher Wert wie oben
53 73 53

Array-Mischen mit Mt19937-Engine

<?php
$engine = new Random\Engine\Mt19937(seed: 1234);
$randomizer = new Random\Randomizer(engine: $engine);

$karten = ['Ass', 'König', 'Dame', 'Bube', 'Zehn'];
$gemischt = $randomizer->shuffleArray($karten);

print_r($gemischt);
Array ( [0] => Bube [1] => König [2] => Zehn [3] => Dame [4] => Ass )

Direktes Abrufen von rohen Bytes über die Engine

<?php
$engine = new Random\Engine\Mt19937(seed: 99);

// generate() liefert 4 Bytes (32 Bit) als Binärstring
$bytes = $engine->generate();
echo bin2hex($bytes) . PHP_EOL; // z. B. '4d6b3f2a'
4d6b3f2a

// Wichtig · Fallstricke

Nicht kryptografisch sicher: Der MT19937-Algorithmus ist nicht für sicherheitsrelevante Zwecke wie Passwortgenerierung, Token oder kryptografische Schlüssel geeignet. Der innere Zustand kann aus 624 aufeinanderfolgenden 32-Bit-Ausgaben vollständig rekonstruiert werden. Verwende in solchen Fällen Random\Engine\Secure.

Der Modus MT_RAND_PHP existiert ausschließlich für Rückwärtskompatibilität mit dem historisch fehlerhaften Verhalten von mt_rand() vor PHP 7.1 und sollte in neuem Code niemals eingesetzt werden.

Bei Verwendung ohne Seed (null) wird intern ein kryptografisch sicherer Seed gewählt; die erzeugte Sequenz ist dennoch vorhersagbar, sobald der Zustand bekannt ist.