指数分布与泊松分布的随机值的产生程序原理解析
最近做毕业设计要涉及到排队问题的仿真。而根据排队论,指数分布的随机值是表示两个排队者进入队列的时间间隔;而泊松分布的随机值表示的是单位时间内进入排队者的数量。
1 先来复习一下公式吧~
1.1 指数分布:
1.1.1 概率密度函数:
1.1.2 概率分布函数:
1.2 泊松分布
1.2.1 概率密度函数:
1.2.2 概率分布律:
1.3 伽马分布
1.3.1 概率密度函数:
1.3.2 概率分布律:
1.3.3 伽马函数:
2 生成连续分布随机变量的一般方法
根据分布函数的性质,F(x)单调上升,,在,所以F(X)可逆。
设y=F(x),则
我们可以用U(U是服从[0,1)均匀分布的随机变量)代替式子中的y,我们需要的目标随机变量X替换x,得:
3 生成指数分布随机变量的方法
因为1-U(U是服从[0,1)均匀分布的随机变量)也服从均匀分布,所以
这时的U必须不等于0。
4 生成泊松分布随机变量的方法
这里我是通过服从指数分布的随机变量来生成泊松分布的随机变量。因为指数分布实际上是伽马分布的一种特殊情况。
大家看下面这个伽马分布的密度函数:
而伽马分布还具有的一个性质是加成性:
因为指数分布是伽马分布的特例,所以也有如上性质。
然后,我们知道指数分布的随机变量是表示两个排队者的时间间隔,我们一直产生期望为的指数分布的随机变量直到,然后停止,这时m-1就是我们要的泊松分布在1时间内的随机变量,根据伽马分布的可加性,的概率就是服从:
因此,令n=m-1这个伽马分布的随机变量=μ的概率,就是:
有上式结果可知,确实服从泊松分布。
这个算法平均产生一次的泊松分布需要产生次的均匀分布的随机变量U,所以在不是很大时,是个不错的算法。
DELPHI指数分与泊松分布:
{*------------------------------------------------------------------------------
仿真模块
@Author DJ尐舞
@Version 2009.02.07 DJ尐舞 Initial revision
-------------------------------------------------------------------------------}
unit EmulateUnit;
interface
type
TEmulate=class
private
public
class function ExponentialRandom(miu:Integer):double;
class function PoissonRandom(lamda:integer):integer;
end;
implementation
{*------------------------------------------------------------------------------
生成指数分布的随机数
@param miu 指数分布的期望
@return double 服从指数分布的随机值
------------------------------------------------------------------------------*}
class function TEmulate.ExponentialRandom(miu:Integer):double;
begin
randomize;
result:=-miu*ln(1-random);
end;
{*------------------------------------------------------------------------------
生成服从泊松分布的随机书
@param lamda 泊松分布的期望
@return integer 服从泊松分布的随机值
------------------------------------------------------------------------------*}
class function TEmulate.PoissonRandom(lamda:integer):integer;
var b,c,r:real;x:integer;
begin
x:=0;b:=1;c:=exp(-lamda);
repeat
begin
r:=random;
b:=b*r;
x:=x+1;
end
until b<c; // 泊松分布需要产生次的均匀分布的随机变量U ,x则是车辆数
result:=x-1;
end;
end.
仿真模块
@Author DJ尐舞
@Version 2009.02.07 DJ尐舞 Initial revision
-------------------------------------------------------------------------------}
unit EmulateUnit;
interface
type
TEmulate=class
private
public
class function ExponentialRandom(miu:Integer):double;
class function PoissonRandom(lamda:integer):integer;
end;
implementation
{*------------------------------------------------------------------------------
生成指数分布的随机数
@param miu 指数分布的期望
@return double 服从指数分布的随机值
------------------------------------------------------------------------------*}
class function TEmulate.ExponentialRandom(miu:Integer):double;
begin
randomize;
result:=-miu*ln(1-random);
end;
{*------------------------------------------------------------------------------
生成服从泊松分布的随机书
@param lamda 泊松分布的期望
@return integer 服从泊松分布的随机值
------------------------------------------------------------------------------*}
class function TEmulate.PoissonRandom(lamda:integer):integer;
var b,c,r:real;x:integer;
begin
x:=0;b:=1;c:=exp(-lamda);
repeat
begin
r:=random;
b:=b*r;
x:=x+1;
end
until b<c; // 泊松分布需要产生次的均匀分布的随机变量U ,x则是车辆数
result:=x-1;
end;
end.
有什么错误欢迎更正哦~
作者:DJ尐舞
欢迎转载,转载请注明出处 http://djbone.cnblogs.com
|
||
Everyday is lonely day. |
|