等待时间和指数分布-北太天元学习29
等待时间和设备故障时间的概率密度函数通常是指数衰减函数。考虑一下在食堂排队等候的时间(以分钟为单位)。这里的等候时间不是指的你排在很多人的后面,从你到达到你开始被服务的等候时间,而是指的是你的前面有且仅有一个人,从他开始被服务,到他服务完毕你开始被服务计算的等候时间,因此这里的等候时间是一个随机变量X。
如果你的前面有5个人,那么你的总等候时间也是一个随机变量Y, 你前面每个人的
被服务时间分别是X_1, X_2, ..., X_5, 那么你的总等候时间Y = X_1+X_2+ ... + X_5. 我们这里先不考虑总等候时间,而是仅仅考虑单人次的等候时间X, 也许应该叫
单人次服务时长更加恰当。 假设记录了200人次学生食堂等候时间的样本,
并生成以下直方图:

我们看到,等待t分钟的概率呈现指数衰减的趋势。对于事件随机发生且独立于先前事件的情况,每单位时间的事件数遵循泊松分布,事件之间的时间是遵循指数分布的连续随机变量。指数分布建模可以用于某些机器或设备(例如灯泡、电池)的寿命, 放射性粒子衰变的时间, 便民热线两次通话之间的时间间隔等情形。
一般来说,我们说T是一个参数为λ 的指数随机变量,如果T具有密度函数
f(t) = λ exp(-λt) if t>0
0 otherwise.
记作 T~ Exponential(λ). 指数分布的累积分布函数还是比较容易计算的
F(t) = P(T<=t) = \int_{-\infty}^{t} f(t) dt = 1 - exp(-λ*t).
在北太天元可以使用内置函数 rand 生成服从[0,1]上均匀分布的随机数,
可以用randn 生成正态分布的随机数, 如何生成服从指数分布的随机数呢?
实际上,我们先生成 X ~ U(0,1) 的随机数 x , 然后再求满足
F(t) = x
t, 其中F 是随机变量T 的累积分布函数,那么t 就是随机变量T的样本。 刚才
求了指数分布的累积分布函数 F(t) = 1-exp(λ*t),
因此 x = 1 -exp ( -λ*t )
求解得到
t = -log( 1 - x ) / λ
这里的 log 是以自然为底的对数。
下面给出北太天元的一个脚本,展示如何生成服从指数分布的随机数。
% 北太天元 学习 指数分布
%等候时间,这里指的是从上一个学生开始打饭计算起,到下一个学生被叫去
%打饭的等候时间, 这是一个随机变量X 。
% 如果前面排着5个人,那么你的等候时间是5*X, 我们这里所研究的
% 等候时间实际不是总的等候时间。
% 所以我们这里的等候时间实际上是一个学生被服务的时间,你等着他
% 被服务好了,然后才轮到你。
close all
clear all
clc
n = 200; %食堂排队打好饭的人次
duration = zeros(n,1); %初始化
lambda = 2; %平均每分钟打好饭的次数(意味着平均打一次饭需要0.5分钟)
for i=1:n
duration(i) = -log(1-rand)/lambda %从[0,1]均匀分布生成的随机数转成指数
%分布的随机数,
end
histogram(duration)
title("北太天元画学生食堂单人次等候时间次数统计的直方图")
假设一个灯泡的平均寿命为100小时,我们想知道在1000小时的时间段内我们将使用多少个灯泡(假设灯泡熄灭时会立即更换)。使用的灯泡数量X是泊松分布的速率λ=1000/100=10(我们预计在1000小时内平均使用10个灯泡)。为了解分布情况,我们可以使用以下北太天元代码对此进行200次模拟, 统计换不同数量的灯泡发生的次数:
%北太天元 研究 指数分布 和 泊松分布的关系
close all
clear
clc
n=200; %模拟次数
num_换灯泡 = zeros(n,1); % 初始换灯泡的次数
lambda = 10; % 把1000小时作为一个时间单位,1000小时中换灯泡的次数
for i=1:n % 第i次模拟
time = 0; %初始化等待时间
while time <= 1 % 总等候时间小于1个时间单位
randExp = - (1/lambda)*log(1-rand); % 产生一个服从指数分布的随机数作为单次等候时间
time = time + randExp; % 更新总的等候时间
num_换灯泡(i) = num_换灯泡(i) + 1; %update number of events
end
num_换灯泡(i)=num_换灯泡(i) - 1; %while循环里的最后一次换灯泡发生在1个单位时间之外,因此要减去
end
histogram(num_换灯泡)
