4.7 生成随机数
连续分布CDF对于生成随机数也很有用。如果可以高效地计算出ICDF(p)(inverse CDF,逆CDF),我们就可以方便地生成服从各种分布的随机值。方法是首先产生0~1之间服从均匀分布的值,然后选择:
例如,指数分布的CDF是:
求解x,得到:
用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,返回随机值,随机值服从以此为参数的威布尔分布。