當前位置: 首頁> 最新文章列表> lcg_value() 如何結合分佈函數創建一個簡單的概率模型?實用示例講解

lcg_value() 如何結合分佈函數創建一個簡單的概率模型?實用示例講解

gitbox 2025-06-17

在概率論與統計學中,模擬隨機事件常常需要生成符合特定分佈的隨機數。 PHP 提供的lcg_value()函數可以生成[0,1) 區間內均勻分佈的偽隨機浮點數。本文將介紹如何利用lcg_value()結合分佈函數,創建一個簡單的概率模型,並通過實例演示其實用方法。


什麼是lcg_value()

lcg_value()是PHP 內置的一個偽隨機數生成函數,基於線性同餘法(Linear Congruential Generator),返回一個均勻分佈在[0, 1) 區間的浮點數。使用這個函數,你可以模擬均勻隨機事件,進而通過轉換實現更複雜的分佈。

 <?php
$randNum = lcg_value();
echo $randNum; // 輸出 0 到 1 之間的浮點數
?>

利用分佈函數創建概率模型

一個概率模型常常定義了隨機變量的分佈函數(Cumulative Distribution Function, CDF)。如果我們有目標分佈的CDF F ( x ) F(x) ,那麼給定一個均勻隨機變量U U n i f o r m ( 0 , 1 ) U \sim \mathrm{Uniform}(0,1) ,通過計算X = F ? 1 ( U ) X = F^{-1}(U) (即反函數變換),就可以得到符合目標分佈的隨機變量。

簡單來說:

  • 使用lcg_value()生成均勻隨機數U U

  • 利用目標分佈的反CDF函數F ? 1 ( U ) F^{-1}(U) 轉換為目標分佈的隨機數


實用示例:生成離散概率分佈的隨機數

假設我們有一個簡單的離散隨機變量X X 取值為{A, B, C},對應概率分別為{0.2, 0.5, 0.3}。如何用lcg_value()來模擬這個隨機變量?

思路是:

  1. 構造該離散分佈的累積分佈函數(CDF)

  2. 生成均勻隨機數u = \text{lcg_value}()

  3. 根據u u 落在哪個區間決定輸出哪個事件

<?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法同樣適用。比如指數分佈,參數為λ \lambda ,其CDF為:

F ( x ) = 1 ? e ? λ x F(x) = 1 - e^{-\lambda x}

其反CDF為:

F ? 1 ( u ) = ? ln ? ( 1 ? u ) λ F^{-1}(u) = -\frac{\ln(1-u)}{\lambda}

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