服从一定分布的随机数

Random Number following a certain distribution

我遇到了一个问题。我必须在 python 中实现一个算法,它需要一个随机数 X,例如 Pr[X ≥ k] = 1/k。我不知道是否已经存在可以给我这个确切值的分布,或者是否有办法使用简单的随机 python 库来实现这个随机生成器。有没有办法做到这一点?预先感谢您的帮助!

最简单的尝试是

X = 1.0 / random.random()

但是,random.random() 的值可以为零,因此这可能会导致被零除错误。根据文档,该值永远不能为 1.0,因此请使用

X = 1.0 / (1.0 - random.random())

对于这个发行版,

Pr[X ≥ k] = Pr[0 < 1/X ≤ 1/k]

= Pr[0 < 1 - random.random() ≤ 1/k]

= Pr[1 - 1/k ≤ random.random() < 1]

= 1 - (1 - 1/k) {因为 random() 在 [0,1) 和 [1-1/k, 1) 是一个子区间}

= 1/k

(我希望我可以在这里使用 MathJax!)当然,所有这些都假设 k ≥ 1,否则你的条件就没有意义了。我还假设 X 是一个连续的随机变量,从 1 到无穷大。如果X是一个正整数(因此k也是一个正整数),就取我给出的公式的底数。

Rory 最终得出了正确的答案,但他的数学证明并不具有建设性——它没有说明如何得到答案,它只表明他的断言是正确的。下面使用概率的基本规则推导出答案。

Pr{X ≥ k} = 1 - Pr{X < k}

X为连续随机变量,

Pr{X < k} = Pr{X ≤ k}

右边是累积分布函数FX(k)的定义,所以

Pr{X ≥ k} = 1 - F(k) = 1/k
F(k) = 1 - 1/k

然后by the inversion theorem我们可以将其设置为等于U,统一的(0,1)RV,并求解k:

U = 1 - 1/k
1 - U = 1/k
k = 1 / (1 - U)

为 U 使用随机数生成器,您就完成了。正如 Rory 指出的那样,这仅对 k ≥ 1 有效,否则它会使 CDF 越界。