我正在尝试编写一个基本模拟(一个队列),它依赖于生成随机 expovariates。虽然 Powershell 提供了一个 Get-Random 函数,但您可以指定一个最小值和一个最大值,但它在 Python 的 random.expovariate(lambd) 函数附近没有任何地方。
假设这是我应该遵循的模型:log(1-$u)/(−λ)
优秀的 Python 文档对此有这样的说法:
"指数分布.lambd 是 1.0 除以所需的平均值。它应该是非零的。(该参数将被称为“lambda”,但这是 Python 中的保留字。)如果 lambd 为正,则返回值的范围从 0 到正无穷大,如果 lambd 为负,则从负无穷到 0。”。在另一个描述中,“expovariate() 产生一个指数分布,用于模拟均匀泊松过程的到达或间隔时间值,例如放射性衰变率或进入 Web 服务器的请求。
帕累托或幂律分布与许多可观察到的现象相匹配,并被克里斯安德龙的书《长尾》推广。paretovariate() 函数对于模拟资源分配给个人(财富给人们、对音乐家的需求、对博客的关注等)很有用。”
我曾尝试在 Powershell 中编写此代码,但我的发行版还差得很远。如果我输入平均值 3,我得到的结果与我应该从平均值 1 得到的结果密切相关。我的代码非常模仿John D. Cook 的 SimpleRNG C# library。
function GetUniform #GetUint
{
Return Get-Random -Minimum -0.00 -Maximum 1
}
# Get exponential random sample with specified mean
function GetExponential_SpecMean{
param([double]$mean)
if ($mean -le 0.0)
{
Write-Host "Mean must be positive. Received $mean."
}
$a = GetExponential
$R = $mean * $a
Return $R
}
# Get exponential random sample with mean 1
function GetExponential
{
$x = GetUniform
Return -[math]::log10(1-$x) # -Math.Log( GetUniform() );
}
cls
$mean5 = 1
$rangeBottom = 0.0
$rangeTop = 1.0
$j = 0
$k = 0
$l = 0
for($i=1; $i -le 1000; $i++){
$a = GetExponential_SpecMean $mean5
if($a -le 1.0){Write-Host $a;$j++}
if($a -gt 1.0){Write-Host $a;$k++}
if(($a -gt $rangeBottom) -and ($a -le $rangeTop)){#Write-Host $a;
$l++}
Write-Host " -> $i "
}
Write-Host "One or less: $j"
Write-Host "Greater than one: $k"
Write-Host "Total in range between bottom $rangeBottom and top $rangeTop : $l"
对于 1000 个样本和 1 的平均值($mean5),我应该得到(我相信)500 个小于或等于 1.0 的结果和 500 个大于 1.0(1:1 比率)的结果,但是我得到的比率为约 9:1,平均值为 1,比例约为 53:47,平均值为 3。
在这个 Stack Overflow 问题中有一些讨论,有一些很好的背景,但它并不特定于 Powershell:Pseudorandom Number Generator - Exponential Distribution