In der Wahrscheinlichkeitstheorie und -statistik erfordern simulierte Zufallsereignisse häufig die Erzeugung von Zufallszahlen, die einer spezifischen Verteilung entsprechen. Die von PHP bereitgestellte LCG_Value () -Funktion kann Pseudo-random-schwimmende Punktzahlen erzeugen, die innerhalb des Intervalls gleichmäßig verteilt sind [0,1). In diesem Artikel wird ein einfaches Wahrscheinlichkeitsmodell erstellt und seine nützlichen Methoden anhand von Beispielen demonstrieren, wie lcg_value () in Kombination mit der Verteilungsfunktion verwendet wird.
LCG_VALUE () ist eine in PHP eingebaute Pseudo-Random-Zahlen-Erzeugungsfunktion. Es basiert auf linearem kongruentem Generator und gibt eine schwimmende Punktzahl zurück, die gleichmäßig im [0, 1) -Intervall verteilt ist. Mit dieser Funktion können Sie gleichmäßige zufällige Ereignisse simulieren und dann durch Transformationen komplexere Verteilungen erzielen.
<?php
$randNum = lcg_value();
echo $randNum; // Ausgabe 0 ankommen 1 Schwimmende Punktzahlen zwischen
?>
Ein Wahrscheinlichkeitsmodell definiert häufig die kumulative Verteilungsfunktion (CDF) von Zufallsvariablen. Wenn wir eine CDF mit der Zielverteilung haben und dann eine gleichmäßige Zufallsvariable gegeben durch Berechnung (d. H. Inverse Funktion Transformation) Sie können zufällige Variablen erhalten, die der Zielverteilung entsprechen.
Einfach sagen:
Verwenden Sie LCG_VALUE (), um einheitliche Zufallszahlen zu erzeugen
Inverse CDF -Funktion unter Verwendung der Zielverteilung wird in eine zufällige Anzahl der Zielverteilung konvertiert
Angenommen, wir haben eine einfache diskrete Zufallsvariable Der Wert von ist {a, b, c} und die entsprechende Wahrscheinlichkeit beträgt {0,2, 0,5, 0,3}. Wie verwendete ich LCG_VALUE (), um diese zufällige Variable zu simulieren?
Die Idee ist:
Konstruieren Sie die kumulative Verteilungsfunktion der diskreten Verteilung (CDF)
Generieren Sie einheitliche Zufallszahl u = \ text {lcg_value} ()
entsprechend Welches Intervall fällt fest, welches Ereignis zu Ausgabe ist?
<?php
function sampleDiscrete() {
$u = lcg_value();
if ($u < 0.2) {
return 'A'; // 0 <= u < 0.2
} elseif ($u < 0.7) { // 0.2 <= u < 0.7 (0.2 + 0.5)
return 'B';
} else { // 0.7 <= u < 1
return 'C';
}
}
// Führen Sie den Test durch
$results = ['A' => 0, 'B' => 0, 'C' => 0];
for ($i = 0; $i < 10000; $i++) {
$sample = sampleDiscrete();
$results[$sample]++;
}
print_r($results);
?>
Nach dem Laufen werden die statistischen Ergebnisse die Wahrscheinlichkeit {0,2, 0,5, 0,3} annähern.
Für die kontinuierliche Verteilung ist auch die Anti-CDF-Methode anwendbar. Zum Beispiel ist die exponentielle Verteilung , sein CDF ist:
Die umgekehrte CDF ist:
Beispiel für die Verwendung von LCG_VALUE (), um exponentiell verteilte Zufallszahlen zu generieren:
<?php
function sampleExponential($lambda) {
$u = lcg_value();
return -log(1 - $u) / $lambda;
}
// 测试Ausgabe
for ($i = 0; $i < 5; $i++) {
echo sampleExponential(2) . "\n"; // lambda = 2
}
?>
lcg_value () erzeugt gleichmäßig verteilte Zufallszahlen, was die Grundlage für die Wahrscheinlichkeitssimulation ist.
In Kombination mit der kumulativen Verteilungsfunktion (CDF) der Zielverteilung oder ihrer inversen Funktion können zufällige Variablen, die eine willkürliche Verteilung erzeugen, transformiert werden.
Die diskrete Verteilung wird durch Intervalle geteilt und die kontinuierliche Verteilung wird durch inverse CDF -Transformation erreicht.
Diese Methode ist sowohl einfach als auch praktisch, geeignet für die schnelle Implementierung von Wahrscheinlichkeitsmodellen und simulierte zufällige Ereignisse.
Eine detailliertere Verwendung finden Sie im offiziellen PHP-Dokument: https://gitbox.net/manual/en/function.lcg-value.php .