4.7 生成随机数

连续分布CDF对于生成随机数也很有用。如果可以高效地计算出ICDF(p)(inverse CDF,逆CDF),我们就可以方便地生成服从各种分布的随机值。方法是首先产生0~1之间服从均匀分布的值,然后选择:

x= ICDF(p)

例如,指数分布的CDF是:

p=1−e-λx

求解x,得到:

x=−log (1−p)/λ

用Python写成的代码如下所示:

  1. def expovariate(lam):
  2. p = random.random()
  3. x = -math.log(1-p) / lam
  4. return x

我们用lam变量表示参数是因为lambda是Python关键字。大部分random.random实现都可以返回0,但不能返回1,所以1-p有可能等于1,但不可能等于0,因为log0是没有定义的。

练习4-14

编写一个weibullvariate函数,参数是lamk,返回随机值,随机值服从以此为参数的威布尔分布。