根据指数分布(离散版本)对 {0,...,n-1} 范围内的整数进行采样的好方法是什么? random.expovariate(lambd)
返回一个从 0 到正无穷大的实数。
更新。更改标题以使其更准确。
通常,可以通过生成均匀随机数然后取逆累积分布 (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()
简单的答案是:从几何分布中选择一个随机数并返回 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,第二部分是常数。第一部分是几何的。