Dans la théorie des probabilités et les statistiques, les événements aléatoires simulés nécessitent souvent la génération de nombres aléatoires qui correspondent à une distribution spécifique. La fonction LCG_VALUE () fournie par PHP peut générer des nombres de points flottants pseudo-aléatoires qui sont uniformément distribués dans l'intervalle [0,1). Cet article présentera comment utiliser LCG_VALUE () combiné à la fonction de distribution pour créer un modèle de probabilité simple et démontrer ses méthodes utiles à travers des exemples.
LCG_VALUE () est une fonction de génération de nombres pseudo-aléatoires construite en php. Il est basé sur un générateur congruentiel linéaire et renvoie un numéro de point flottant uniformément distribué dans l'intervalle [0, 1). En utilisant cette fonction, vous pouvez simuler des événements aléatoires uniformes, puis obtenir des distributions plus complexes par le biais de transformations.
<?php
$randNum = lcg_value();
echo $randNum; // Sortir 0 arriver 1 Nombres de points flottants entre
?>
Un modèle de probabilité définit souvent la fonction de distribution cumulative (CDF) des variables aléatoires. Si nous avons un CDF avec la distribution cible , puis donné une variable aléatoire uniforme , par calcul (c'est-à-dire la transformation de la fonction inverse), vous pouvez obtenir des variables aléatoires qui correspondent à la distribution cible.
Autrement dit:
Utilisez LCG_Value () pour générer des nombres aléatoires uniformes
Fonction CDF inverse à l'aide de la distribution cible est converti en un nombre aléatoire de la distribution cible
Supposons que nous ayons une variable aléatoire discrète simple La valeur de est {a, b, c}, et la probabilité correspondante est respectivement {0,2, 0,5, 0,3}. Comment utiliser LCG_Value () pour simuler cette variable aléatoire?
L'idée est:
Construire la fonction de distribution cumulative de la distribution discrète (CDF)
Générer un nombre aléatoire uniforme u = \ text {lcg_value} ()
selon Quel intervalle tombe détermine quel événement à sortir
<?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';
}
}
// Faire le test
$results = ['A' => 0, 'B' => 0, 'C' => 0];
for ($i = 0; $i < 10000; $i++) {
$sample = sampleDiscrete();
$results[$sample]++;
}
print_r($results);
?>
Après l'exécution, les résultats statistiques se rapprocheront de la probabilité {0,2, 0,5, 0,3}.
Pour une distribution continue, la méthode anti-CDF est également applicable. Par exemple, la distribution exponentielle est , son CDF est:
Le CDF inversé est:
Exemple d'utilisation de LCG_VALUE () pour générer des nombres aléatoires distribués de façon exponentielle:
<?php
function sampleExponential($lambda) {
$u = lcg_value();
return -log(1 - $u) / $lambda;
}
// 测试Sortir
for ($i = 0; $i < 5; $i++) {
echo sampleExponential(2) . "\n"; // lambda = 2
}
?>
LCG_VALUE () génère des nombres aléatoires uniformément distribués, qui est la base de la simulation de probabilité.
Combinés avec la fonction de distribution cumulative (CDF) de la distribution cible ou de sa fonction inverse, les variables aléatoires qui génèrent une distribution arbitraire peuvent être transformées.
La distribution discrète est divisée par intervalles et la distribution continue est réalisée par transformation inverse du CDF.
Cette méthode est à la fois simple et pratique, adaptée à la mise en œuvre rapide de modèles de probabilité et d'événements aléatoires simulés.
Pour une utilisation plus détaillée, veuillez vous référer au document PHP officiel: https://gitbox.net/manual/en/fonction.lcg-value.php .