当前位置: 首页> 最新文章列表> 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),那么给定一个均匀随机变量 UUniform(0,1)U \sim \mathrm{Uniform}(0,1),通过计算 X=F?1(U)X = F^{-1}(U)(即反函数变换),就可以得到符合目标分布的随机变量。

简单来说:

  • 使用 lcg_value() 生成均匀随机数 UU

  • 利用目标分布的反CDF函数 F?1(U)F^{-1}(U) 转换为目标分布的随机数


实用示例:生成离散概率分布的随机数

假设我们有一个简单的离散随机变量 XX 取值为 {A, B, C},对应概率分别为 {0.2, 0.5, 0.3}。如何用 lcg_value() 来模拟这个随机变量?

思路是:

  1. 构造该离散分布的累积分布函数 (CDF)

  2. 生成均匀随机数 u = \text{lcg_value}()

  3. 根据 uu 落在哪个区间决定输出哪个事件

<?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?λxF(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