2

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

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

4

3 回答 3

4

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

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

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()
于 2013-05-01T13:48:56.740 回答
1

指数分布的离散模拟是几何分布。这是在NumPy中实现的:

>>> import numpy as np
>>> np.random.geometric(.01, 10)
array([ 33,  45,  41, 171,  62, 119,  56,  47,  30, 197])
于 2013-05-01T11:45:16.587 回答
-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,第二部分是常数。第一部分是几何的。

于 2013-05-01T13:28:01.000 回答