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