我需要在指数分布后分布的正给定区间(a,b)上生成数字.使用逆向CDF方法,我创建了一个指数分布式的数字生成器.但是,当然,这个数字是一个正数,我希望它在给定的时间间隔内.我该怎么做只在间隔上生成?
使用逆cdf方法生成指数分布的数字的代码是in
Python
u = random.uniform(0,1)
return (-1/L)*math.log(u)
其中L是给定的正参数.
提前致谢
最佳答案 结果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的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.