根据给定比例随机生成数字

4
我需要在给定的正区间(a,b)上生成按指数分布的数字。使用“反函数法”,我制作了一个指数分布的数字生成器。但是,这个数字是正数,我希望它在给定的区间上。我该怎么做才能只在区间内生成?
在Python中使用反函数法生成指数分布的数字代码如下:
u = random.uniform(0,1)
return (-1/L)*math.log(u)

其中 L 是一个给定的正参数。

提前感谢。


1
你可以丢弃不在该区间内的数字,但是这样你的函数就会有一个变量和潜在的无限运行时间。 - jonrsharpe
是的,这就是为什么我想在间隔中生成它,但是我不知道该如何做。 - Giiovanna
如果您能找出一个“L”,使得从您的反向CDF返回的值始终为“0-1”,那么您可以将其用作沿着您的区间的百分比。 - aruisdante
这是不可能的,因为它总会生成参数为L的指数分布的数字。它将在区间(0,无穷大)上。 - Giiovanna
是的,我刚想到了。如果您从分布中得到的值没有被限制,我认为您除了拒绝抽样之外别无选择。除非您能够找出一个“u”界限来限制输出(因为“当u->0时,返回->无穷大”)。 - aruisdante
是的,但这不会生成指数分布的数字,或者我需要进行任何生成指数分布数字的转换,并且它将在(0,无穷大)上。我认为没有有效的解决方案。 - Giiovanna
1个回答

2

在限制在 [a,b] 区间内时,结果 x 的概率为 L exp(-Lx),但是 x 在 [a,b] 内的概率会因 CDF(累积分布函数)在 ab 之间所占的比例缩放增加:从 ab 的积分 ( L exp(-Lt)dt ) = -(exp(-Lb) - exp(-La))。

因此,x 处的概率密度函数为:

L exp(-Lx) / (exp(-La) - exp(-Lb)),

得到 x 处的 CDF 为:

ax 的积分 [ 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


请参考http://www.eg.bucknell.edu/~xmeng/Course/CS6337/Note/master/node50.html中的推导步骤。 - honi
但是,在这种情况下,生成的样本是否仍然服从指数分布(L)?我不明白为什么会这样。 - Giiovanna
谢谢,我会看看能否使用这个来解决我的问题,因为随机数生成器没有按照我的原始分布生成样本。 - Giiovanna
指的是指数分布。顺便说一下,我觉得你在步骤-Lx = -La + log( 1 - u[1 - exp(-Lb)/exp(-La)]) 中犯了一个错误,因为求和的对数不是对数的总和。 - Giiovanna
我将exp(-La)分布出来得到exp(-La)(1 - u[1 - exp(-Lb)/exp(-La)]),然后取了它的对数。一个乘积的对数是各个因子对数的和。 - honi
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接