我需要在指数分布后分布的正给定区间(a,b)上生成数字。使用反向CDF方法,我创建了一个指数分布的数字生成器。但是,当然,这个数字是一个正数,我希望它在给定的时间间隔内。我该怎么办才能在间隔时间内生成?
使用逆cdf方法生成指数分布的数字的代码是in 蟒
u = random.uniform(0,1)
return (-1/L)*math.log(u)
其中L是给定的正参数。
提前致谢
答案 0 :(得分:2)
结果 x 的概率通常为 L exp( -Lx )。但是,当我们被限制为[ a,b ]时,[ a,b ]中 x 的概率按比例增加1 / a 和 b 之间发生的CDF分数:从 a 到 b 的整数( L exp( -Lt ) dt )= - (exp( -Lb ) - exp( -La ))。
因此,x的pdf是
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(< em> -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 )日志(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
。