Zufallszahl in PHP. Verwendung der PHP-Zufallsfunktion

Um eine Zufallszahl zu generieren, können Sie die PHP-Funktion rand() oder mt_rand() verwenden. Für die Benennung von Variablen, Dateien, die Erstellung von Schlüsselinformationen und die Gewährleistung der Sicherheit ergibt sich in der Praxis häufig die Anforderung, Zufallszahlen zu verwenden.

Zufälligkeit und Einzigartigkeit

Die PHP-Zufallsfunktion gibt es in zwei Varianten: rand() und mt_rand(). Es wird angenommen, dass der Algorithmus im ersten Fall einfacher ist und Pseudozufallszahlen generiert. Die zweite Option verfügt über einen schnelleren Algorithmus und bekannte mathematische Eigenschaften. Wenn Sie eine Zufallszahl benötigen, können Sie in den meisten Fällen eine Reihe von PHP-Zufallsaufrufen verwenden und eine eindeutige Zahlenkombination erhalten.

Wenn man Zahlen von 1 bis 26 oder von 1 bis 32 zugrunde legt und sie zufällig erhält, kann man Schlüsselinformationen als Folge lateinischer oder kyrillischer Buchstaben bilden. In diesem Fall handelt es sich bei PHP Random um eine Möglichkeit, eine Folge alphabetischer Informationen zu erzeugen, beispielsweise zum Testen von Kommunikationskanälen oder Algorithmen.

Eine Zufallszahl ist selten eindeutig, da sie gemäß dem Verteilungsgesetz einer Zufallsvariablen mehrmals vorkommen kann. Wenn Sie jedoch insbesondere die statischen Variablen PHP und Math.random der JavaScript-Sprache kombinieren, können Sie eine echte, einzigartige Zufallszahl erhalten, die sich im Laufe der Zeit nicht wiederholt.

Verwendung der Zeitfunktion

Mit der Zeitfunktion, sowohl in PHP als auch in JavaScript, können Sie eindeutige Zahlenkombinationen bilden, wenn zu einem bestimmten Zeitpunkt eine ausreichend große Anzahl von Ereignissen auftreten kann und die Zufallsvariable wiederholt wird.

Durch die Anwendung von PHP-Zufällen im Sekunden- oder Millisekundenbereich über einen großen Bereich möglicher Werte ist es möglich, einzigartige Zufallskombinationen aus Zahlen oder Buchstaben zu erhalten. Was sonst?

Durch die Kombination des Werts der Zeitfunktion, einer sequentiell wachsenden Zahl und PHP-Zufallszahlen können Sie eine zuverlässige Sicherheit der Client- und Server-Kommunikationskanäle gewährleisten, eindeutige Codes für Variablen erstellen und unvorhersehbare Ereignisse in Algorithmen generieren.

Ein PHP-Zufallszahlengenerator ist für die meisten Aufgaben eine hervorragende Lösung, insbesondere wenn Sie mit minimalem Aufwand schnell qualitativ hochwertige Ergebnisse erzielen müssen. Durch die Verwendung der Funktionen rand() und mt_rand in Verbindung mit sequentiell wachsenden Reihen von Zahlen oder Zeitwerten können Sie Zufallszahlen erhalten, die sich sowohl in Werten wiederholen als auch eindeutig sind.

Aufgabe
Sie müssen eine Zufallszahl innerhalb eines numerischen Bereichs generieren.

Lösung
Dafür ist die Funktion mt_rand() konzipiert:

// Zufallszahl zwischen $upper und $lower, einschließlich
$random_number = mt_rand($lower, $upper);

Diskussion
Das Generieren von Zufallszahlen ist nützlich, wenn Sie ein zufälliges Bild auf dem Bildschirm anzeigen, zufällig einen Startpunkt in einem Spiel zuweisen, einen zufälligen Eintrag aus einer Datenbank auswählen oder eine eindeutige Sitzungskennung generieren müssen. Um eine Zufallszahl im Intervall zwischen zwei Punkten zu generieren, müssen Sie zwei Argumente an die Funktion mt_rand() übergeben:

$random_number = mt_rand(1, 100);

Der Aufruf von mt_rand() ohne Argumente gibt eine Zahl zwischen Null und der maximalen Zufallszahl zurück, die von mt_getrandmax() zurückgegeben wird. Für einen Computer ist es schwierig, eine wirklich zufällige Zahl zu generieren. Er ist viel besser darin, Anweisungen methodisch zu befolgen und ist nicht so gut, wenn von ihm spontanes Handeln verlangt wird. Wenn Sie einen Computer zwingen müssen, eine Zufallszahl zu erzeugen, müssen Sie ihm einen bestimmten Satz wiederholbarer Befehle geben, und die Tatsache der Wiederholbarkeit macht das Erreichen von Zufälligkeit weniger wahrscheinlich.

PHP verfügt über zwei verschiedene Zufallszahlengeneratoren: die klassische Funktion namens rand() und die fortgeschrittenere Funktion mt_rand().

MT (Mersenne Twister) ist ein Pseudozufallszahlengenerator, benannt nach dem französischen Mönch und Mathematiker Marin Mersenne, der Primzahlen untersuchte. Der Algorithmus dieses Generators basiert auf diesen Primzahlen. Die Funktion mt_rand() ist schneller als die Funktion rand() und erzeugt mehr Zufallszahlen, daher bevorzugen wir erstere.

Wenn Sie eine PHP-Version vor 4.2 haben, müssen Sie vor dem ersten Aufruf der Funktion mt_rand() (oder rand()) den Generator mit einem Anfangswert initialisieren, indem Sie die Funktion mt_srand() (oder srand( )) Funktion. Der Startwert ist die Zahl, die die Zufallsfunktion als Grundlage für die Generierung der von ihr zurückgegebenen Zufallszahlen verwendet. es bezieht sich auf eine Möglichkeit, das oben erwähnte Dilemma – Wiederholbarkeit versus Zufälligkeit – zu lösen.

Als Anfangswert, der sich sehr schnell und mit geringer Wiederholwahrscheinlichkeit ändert (diese Eigenschaften sollten einen guten Anfangswert charakterisieren), können Sie den von der hochpräzisen Zeitfunktion microtime() zurückgegebenen Wert nehmen. Es reicht aus, den Generator einmal zu initialisieren. PHP 4.2 und höher übernimmt die Initialisierung automatisch, aber wenn der Anfangswert vor dem ersten Aufruf von mt_rand() manuell festgelegt wird, ersetzt PHP ihn nicht durch seinen eigenen Anfangswert.

Wenn Sie einen zufälligen Datensatz aus einer Datenbank auswählen müssen, ist es am einfachsten, zunächst die Gesamtzahl der Felder in der Tabelle zu ermitteln, eine Zufallszahl aus diesem Bereich auszuwählen und dann diese Zeile aus der Datenbank abzufragen:

$sth = $dbh->query("SELECT COUNT(*) AS count FROM quotes");
if ($row = $sth->fetchRow()) (
$count = $row;
) anders (
die ($row->getMessage());
}
$random = mt_rand(0, $count - 1);
$sth = $dbh->query("SELECT quote FROM quotes LIMIT $random,1");
while ($row = $sth->fetchRow()) (
$row drucken.

"\N";
}

Dieses Code-Snippet bestimmt die Gesamtzahl der Zeilen in der Tabelle, generiert eine Zufallszahl aus diesem Bereich und verwendet dann LIMIT $random,1, um eine Zeile aus der Tabelle ab Position $random auszuwählen. In MySQL Version 3.23 oder höher ist eine alternative Option möglich:

$sth = $dbh->query("SELECT quote FROM quotes ORDER BY RAND() LIMIT 1");
while ($row = $sth->fetchRow()) (
$row drucken. "\N";
}

In diesem Fall sortiert MySQL zunächst die Zeilen nach dem Zufallsprinzip und gibt dann die erste Zeile zurück.

Initialisiert den Zufallszahlengenerator. Syntax:

Void srand(int same)

Initialisiert den Zufallszahlengenerator mit dem Startwert.

Srand((double) microtime()*1000000);
$random = rand();
echo $random;

GETRANDMAX

Gibt die größtmögliche Zufallszahl zurück. Syntax:

Int getrandmax()

Diese Funktion gibt den Maximalwert zurück, der mit der Zrand() erhalten werden kann.

Normalerweise ist es 32767

Erzeugt eine Zufallszahl. Syntax:

Int rand()

Wenn diese Funktion mit den optionalen Parametern „min“ und „max“ aufgerufen wird, generiert sie eine Zufallszahl bis einschließlich dieser Parameter. Wenn die Parameter „min“ und „max“ fehlen, wird eine Zahl im Bereich von 0 bis RAND_MAX zurückgegeben.

Damit diese Funktion ordnungsgemäß funktioniert, müssen Sie vor der Verwendung den Zufallszahlengenerator mit der Funktion srand() initialisieren.

lcg_value()

LCG-Pseudozufallszahlengenerator (PHP 4, PHP 5)

Beschreibung:

Float lcg_value (void)

lcg_value() gibt eine Pseudozufallszahl im Bereich (0, 1) zurück. Die Funktion kombiniert zwei Generatoren mit 2^31 - 85 und 2^31 - 249 in einer Periode.

mt_getrandmax()

Zeigt den größtmöglichen Zufallswert an (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Beschreibung:

Int mt_getrandmax (void)

Zeigt den maximalen Wert an, der von mt_rand() zurückgegeben werden kann

mt_rand()

Erzeugt den besten Zufallswert (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Beschreibung:

int mt_rand()

Viele ältere Versionen von Zufallszahlengeneratoren weisen fragwürdige Eigenschaften auf und sind langsam. Standardmäßig verwendet PHP die Funktion rand(), um Zufallszahlen zu generieren. Die Funktion mt_rand() ist ein guter Ersatz. Es verwendet einen Zufallszahlengenerator, der viermal schneller als rand() ist, und verwendet Mersenne Twister.

Ohne die optionalen Min- und Max-Argumente aufgerufen, gibt mt_rand() einen pseudozufälligen Wert zwischen 0 und RAND_MAX zurück. Wenn Sie beispielsweise Zufallswerte zwischen 5 und 15 einschließlich erhalten müssen, suchen Sie nach mt_rand (5, 15).

Beispiel für die Verwendung von mt_rand()

Das Ergebnis der Ausführung dieses Beispiels wird etwa so aussehen:

1604716014
1478613278
6

Kommentar

Hinweis: In Versionen vor 3.0.7 gab der zweite Parameter der Funktion den Zahlenbereich an. Um in diesen Versionen beispielsweise Zufallszahlen zwischen 5 und 15 zu erhalten, müssen Sie die Funktion mt_rand(5, 11) angeben.

mt_srand()

Legt den Anfangswert des besten Zufallszahlengenerators fest (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Beschreibung:

Void mt_srand()

Legt den Anfangswert des Zufallszahlengenerators mithilfe von Seed fest. Ab PHP 4.2.0 ist Seed optional und die Standardeinstellungen für Zufallswerte entfallen.

Beispiel für mt_srand()

Hinweis: Ab PHP 4.2.0 ist es nicht mehr notwendig, den Zufallszahlengenerator mit srand() oder mt_srand() zu initialisieren, da dies nun automatisch erfolgt.

Technisch gesehen ist der Begriff „Zufallszahlengenerator“ Unsinn, da Zahlen selbst nicht zufällig sind. Ist beispielsweise 100 eine Zufallszahl? Was ist mit 25? Was dieser Begriff eigentlich bedeutet, ist, dass er eine Folge von Zahlen erzeugt, die zufällig erscheinen. Dies wirft eine schwierigere Frage auf: Was ist eine Folge von Zufallszahlen? Die einzig richtige Antwort: Eine Folge von Zufallszahlen ist eine Folge, in der alle Elemente keinen Zusammenhang haben. Diese Definition führt zu dem Paradox, dass jede Sequenz entweder zufällig oder nicht zufällig sein kann, je nachdem, wie die Sequenz erhalten wird. Zum Beispiel die folgende Zahlenfolge
1 2 3 4 5 6 7 8 9 0
wurde erhalten, indem die oberste Zeile der Tastatur der Reihe nach eingegeben wurde, sodass die Reihenfolge nicht als zufällig generiert betrachtet werden kann. Was aber, wenn man die gleiche Reihenfolge erhält, wenn man die nummerierten Tennisbälle aus dem Fass nimmt? In diesem Fall handelt es sich bereits um eine zufällig generierte Sequenz. Dieses Beispiel zeigt, dass die Zufälligkeit einer Sequenz davon abhängt, wie sie erhalten wurde, und nicht von der Sequenz selbst.

Denken Sie daran, dass eine computergenerierte Zahlenfolge deterministisch ist: Jede Zahl außer der ersten hängt von den Zahlen davor ab. Technisch bedeutet dies, dass ein Computer nur eine quasizufällige Zahlenfolge erzeugen kann, d. h. Tatsächlich sind sie nicht wirklich zufällig. Dies ist jedoch für die meisten Aufgaben ausreichend und der Einfachheit halber werden solche Sequenzen als zufällig bezeichnet. Eine sehr interessante Methode wurde von John von Neumann entwickelt; es wird oft als quadratischer Mittelwert bezeichnet. Bei dieser Methode wird die vorherige Zufallszahl quadriert und dann werden die mittleren Ziffern aus dem Ergebnis extrahiert. Wenn Sie beispielsweise Zahlen mit drei Ziffern erstellen und die vorherige Zahl 121 war, ergibt das Quadrieren das Ergebnis 14641. Das Isolieren der mittleren drei Ziffern ergibt die nächste Zufallszahl 464. Der Nachteil dieser Methode besteht darin, dass sie einen sehr hohen Wert hat kurze Wiederholungsperiode, Zyklus genannt. Aus diesem Grund wird diese Methode heute nicht mehr angewendet. Moderne Methoden zur Generierung von Zufallszahlen sind wesentlich komplexer.

Zufallszahlen in PHP

PHP verfügt über zwei Funktionsgruppen für die Arbeit mit Zufallszahlen. Rein äußerlich sind sie durch das Präfix mt_ für alle Funktionen einer der Gruppen zu unterscheiden.

Veraltete Funktionen
Rand-Funktion Gibt eine Ganzzahl zwischen Null und dem Wert von RAND_MAX (also 32767) zurück. Kann zwei optionale ganzzahlige Parameter haben – wenn sie angegeben werden, wird eine Zufallszahl vom ersten bis zum zweiten Parameter generiert.

Echo rand(); Echo Rand(1.100); // Gib eine Zufallszahl von 1 bis 100 aus

Funktionsrand. Gibt die Folge von Zufallszahlen an, die von der Rand-Funktion erzeugt werden. Es hat einen ganzen Parameter – für unterschiedliche Werte dieses Parameters erzeugt Rand unterschiedliche Zahlenfolgen. Die srand-Funktion muss nur einmal vor allen Aufrufen der rand-Funktion aufgerufen werden. Anwendungsbeispiel:

Srand(1288); // Initialisiere den Zufallszahlengenerator for($i=0; $i