在 Python 中生成指数分布

Generate exponential distribution in Python

我知道 random.expovariate 函数,但这不是我需要的。 我想生成一个长度为 N 的流,其中 1M 之间的每个元素 i 的选择概率为 1/(2^(i+1) ) 因此,选择元素 0 的概率为 1/2,选择元素 1 的概率为 1/4,选择元素 2 的概率为 1/8,等等

在 python 中有什么简单的方法可以做到这一点吗?

简单的解决方案是还原函数并预测概率以找到数字:

def generate():
    proba = random.random()
    max = 0
    for i in range(1,M+1):
         max += (1/2)**i
         if(proba<= max):
              return i-1
    return generate()

如果 M 很小,则分布不收敛,因此并非所有 [0,1] 都可以到达,所以您再试一次。

小测试:

M = 10
res = [0 for i in range(M+1)]
for i in range(1000):
    res[generate()]+=1
plt.plot([r/1000 for r in res])