详解Python random.expovariate(获取一个指数分布的随机数)函数的使用方法

  • Post category:Python

Python 中 random.expovariate 函数的作用与使用方法

random.expovariate(lambd) 是 Python 的 random 模块中用于生成服从指数分布的随机浮点数的函数。其中,$\lambda$ 是指数分布的参数,取值范围为正实数。该函数返回一个大于零的随机浮点数,其概率密度函数为:

$$ f(x; \lambda) = \lambda e^{-\lambda x} $$

因此,随机生成的浮点数 x 的期望值为

$$ E(x) = \frac{1}{\lambda} $$

可见,当 $\lambda$ 越大时,生成的随机浮点数越小的概率越大。

random.expovariate 函数的使用方法

下面是 random.expovariate 函数的使用方法:

import random

# 生成服从参数为 lambd 的指数分布的随机浮点数
result = random.expovariate(lambd)
print(result)

其中,lambd 是指数分布的参数,由调用者指定。为了生成服从指数分布的随机数,需要先确定指数分布的参数 $\lambda$。下面是两个实例:

实例1:随机生成壶咖啡泡制的时间间隔

某家咖啡店有一台咖啡机,每隔一段时间会自动冲泡一壶咖啡。为了让冲泡时间更接近真实情况,我们可以利用指数分布生成随机数来模拟冲泡时间间隔。

假设每隔平均 10 分钟冲泡一壶咖啡,则指数分布的参数为 $\lambda = \frac{1}{10}$。下面的代码可以生成一个接近于指数分布的随机浮点数,表示空闲时间间隔:

import random

lambd = 1 / 10  # 均值为 10 分钟
idle_time = random.expovariate(lambd)
print(idle_time)

实例2:模拟随机变量的取值

指数分布的性质之一是“无记忆性”,即概率分布与前面的随机变量取值无关。下面的程序演示了:在一个循环中,不断生成服从参数为 $\lambda$ 的指数分布的随机浮点数,将其求和并计算平均值,然后输出平均值和理论平均值 $\frac{1}{\lambda}$。可以看到,随着样本数的增加,取得的随机浮点数的平均值越来越接近理论平均值。

import random

lambd = 1 / 10  # 指数分布的参数
N = 100000     # 循环次数
sum = 0

for i in range(N):
    xi = random.expovariate(lambd)
    sum += xi

avg = sum / N
print("样本平均值 = ", avg)
print("理论平均值 = ", 1/lambd)

输出结果:

样本平均值 =  9.977981701803017
理论平均值 =  10.0