离散模拟时候经常遇到这个分布.
先说结论:
老板开小卖部,平均经过\(\lambda\)时间会有一个客人进店买东西, 那么第一个客人进店的时间服从指数分布. 速率是 \(1/\lambda\) , 密度函数是: $\frac{1}{\lambda}e^{-\frac{x}{\lambda}} $. 表示当前时间是x, 那么这个时间点第一个客人进来的概率是这个.
证明过程:
先证泊松分布. 再利用泊松分布得到指数分布.
python源码分析:
import random
random.expovariate(1.0 / interval) # interval就是平均多少小时会有一个客人进来买东西.
def expovariate(self, lambd):
"""Exponential distribution.
lambd is 1.0 divided by the desired mean. It should be
nonzero. (The parameter would be called "lambda", but that is
a reserved word in Python.) Returned values range from 0 to
positive infinity if lambd is positive, and from negative
infinity to 0 if lambd is negative.
"""
# lambd: rate lambd = 1/mean
# ('lambda' is a Python reserved word)
# we use 1-random() instead of random() to preclude the
# possibility of taking the log of zero.
return -_log(1.0 - self.random()) / lambd
上来一直没看懂源码, 后来问了问心一言和ds. 都提到了逆采样.他们用累计分布来计算密度分布,非常好的思路.
首先我们看指数分布的 CDF, 也就是密度函数的积分.
F(x;λ)=P(X≤x)=\(1−e^{−λx}\) ,其中λ是速率=1/mean
\(y=1−e^{−λx}\)
那么我们有\(e^{−λx}=1-y\), 两遍取log
λx=-log(1-y)
两遍除以λ就是我们上面代码 return部分的公式了.