在限制在 [a,b] 区间内时,结果 x 的概率为 L exp(-Lx),但是 x 在 [a,b] 内的概率会因 CDF(累积分布函数)在 a 和 b 之间所占的比例缩放增加:从 a 到 b 的积分 ( L exp(-Lt)dt ) = -(exp(-Lb) - exp(-La))。
因此,x 处的概率密度函数为:
L exp(-Lx) / (exp(-La) - exp(-Lb)),
得到 x 处的 CDF 为:
从 a 到 x 的积分 [ L exp(-Lt) / (exp(-La) - exp(-Lb)) dt ]
= [-exp(-Lx) + exp(-La)] / [exp(-La) - exp(-Lb)] = u
现在求反函数:
exp(-Lx) = exp(-La) - u[exp(-La) - exp(-Lb)]
-Lx = -La + log(1 - u[1 - exp(-Lb)/exp(-La)])
x = a - (1/L)log(1 - u[1 - exp(-Lb)/exp(-La)])
给出代码:
u = random.uniform(0,1)
return a + (-1/L)*math.log( 1 - u*(1 - math.exp(-L*b)/math.exp(-L*a)) )
注意:对于较大的L或a,math.exp(-L*a)
会四舍五入为0,导致ZeroDivisionError
。