截断几何分布的样本整数

时间:2013-05-01 11:37:36

标签: python math

根据指数分布的(离散版本),在{0,...,n-1}范围内对整数进行采样的好方法是什么? random.expovariate(lambd)返回从0到正无穷大的实数。

更新。更改了标题以使其更准确。

3 个答案:

答案 0 :(得分:4)

通常,可以通过生成均匀随机数然后采用逆累积分布(CDF)从分布中进行采样。

因此,要从截断的分布中进行采样,您可以生成一个统一的随机数,然后取截断的CDF的倒数。截断的CDF只是n-1处标准几何CDF值缩放的正常CDF:

import numpy as np
import matplotlib.pyplot as plt

p=.3

bins=np.arange(0,50,1)

r=np.random.rand( 1000 )
gen=np.floor(np.log(r)/np.log(1-p))
plt.hist(gen,bins=bins,alpha=.8)

N=5
gen_trunc=np.floor(np.log(1-r*(1-(1-p)**N))/np.log(1-p))
plt.hist(gen_trunc,bins=bins,alpha=.8)

plt.show()

答案 1 :(得分:1)

指数分布的离散模拟是geometric distribution。这是在NumPy

中实现的
>>> import numpy as np
>>> np.random.geometric(.01, 10)
array([ 33,  45,  41, 171,  62, 119,  56,  47,  30, 197])

答案 2 :(得分:-1)

简单的答案是:从几何分布中选择一个随机数并返回mod n。

例如:random.geometric(p)%n

P(x)= p(1-p)^ x + p(1-p)^(x + n)+ p(1-p)^(x + 2n)....

= p(1-p)^ x *(1+(1-p)^ n +(1-p)^(2n)...)

注意第二部分是给定p和n的常数。第一部分是几何。