根据指数分布的(离散版本),在{0,...,n-1}范围内对整数进行采样的好方法是什么? random.expovariate(lambd)
返回从0到正无穷大的实数。
更新。更改了标题以使其更准确。
答案 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的常数。第一部分是几何。