在概率论与统计学中,模拟随机事件常常需要生成符合特定分布的随机数。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 。