確率理論と統計では、シミュレートされたランダムイベントには、特定の分布に一致する乱数の生成が必要になることがよくあります。 PHPによって提供されるLCG_Value()関数は、間隔[0,1)内に均等に分布する擬似ランダム浮動小数点数を生成できます。この記事では、分布関数と組み合わせてLCG_VALUE()を使用する方法を紹介し、単純な確率モデルを作成し、例を介してその有用な方法を実証します。
LCG_VALUE()は、PHPで構築された擬似ランダム数生成関数です。これは、線形合同ジェネレーターに基づいており、[0、1)間隔で均等に分布している浮動小数点数を返します。この関数を使用して、均一なランダムイベントをシミュレートし、変換を通じてより複雑な分布を実現できます。
<?php
$randNum = lcg_value();
echo $randNum; // 出力 0 到着 1 間の浮動小数点数
?>
確率モデルは、多くの場合、ランダム変数の累積分布関数(CDF)を定義します。ターゲット分布を備えたCDFがある場合 、その後、均一なランダム変数が与えられます 、計算による (つまり、逆関数変換)、ターゲット分布に一致するランダム変数を取得できます。
簡単に言えば:
lcg_value()を使用して、均一な乱数を生成します
ターゲット分布を使用した逆CDF関数 は、ターゲット分布の乱数に変換されます
単純な離散ランダム変数があるとします の値は{a、b、c}であり、対応する確率はそれぞれ{0.2、0.5、0.3}です。 lcg_value()を使用してこのランダム変数をシミュレートする方法は?
アイデアは次のとおりです。
離散分布(CDF)の累積分布関数を構築する
均一な乱数u = \ text {lcg_value}()を生成します
によると どの間隔落ちるかが出力するイベントを決定する
<?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';
}
}
// テストを実行します
$results = ['A' => 0, 'B' => 0, 'C' => 0];
for ($i = 0; $i < 10000; $i++) {
$sample = sampleDiscrete();
$results[$sample]++;
}
print_r($results);
?>
実行後、統計結果は確率{0.2、0.5、0.3}に近似します。
連続分布のために、ANTI-CDFメソッドも適用されます。たとえば、指数分布はです 、そのCDFは次のとおりです。
逆のCDFは次のとおりです。
LCG_VALUE()を使用して、指数関数的に分布した乱数を生成する例:
<?php
function sampleExponential($lambda) {
$u = lcg_value();
return -log(1 - $u) / $lambda;
}
// 测试出力
for ($i = 0; $i < 5; $i++) {
echo sampleExponential(2) . "\n"; // lambda = 2
}
?>
lcg_value()は、均一に分布した乱数を生成します。これは確率シミュレーションの基礎です。
ターゲット分布またはその逆関数の累積分布関数(CDF)と組み合わせて、任意の分布を生成するランダム変数を変換できます。
離散分布は間隔で分割され、逆のCDF変換によって連続分布が達成されます。
この方法は、シンプルで実用的であり、確率モデルとシミュレートされたランダムイベントの迅速な実装に適しています。
より詳細な使用法については、公式のPHPドキュメントhttps://gitbox.net/manual/en/function.lcg-value.phpを参照してください。