在概率論與統計學中,模擬隨機事件常常需要生成符合特定分佈的隨機數。 PHP 提供的lcg_value()函數可以生成[0,1) 區間內均勻分佈的偽隨機浮點數。本文將介紹如何利用lcg_value()結合分佈函數,創建一個簡單的概率模型,並通過實例演示其實用方法。
lcg_value()是PHP 內置的一個偽隨機數生成函數,基於線性同餘法(Linear Congruential Generator),返回一個均勻分佈在[0, 1) 區間的浮點數。使用這個函數,你可以模擬均勻隨機事件,進而通過轉換實現更複雜的分佈。
<?php
$randNum = lcg_value();
echo $randNum; // 輸出 0 到 1 之間的浮點數
?>
一個概率模型常常定義了隨機變量的分佈函數(Cumulative Distribution Function, 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}。
對於連續型分佈,反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 。