4.7 生成随机数

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

x=ICDF(p)x= ICDF(p)

例如,指数分布的CDF是:

p=1eλxp=1-e^{-\lambda x}

求解x,得到:

x=log(1p)/λx=-log (1-p)/\lambda

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

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

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

练习4-14

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