Generadores de Números para Distribuciones Continuas

¬ Principal 

Las siguientes funciones devuelven números aleatorios para cada distribución. Incluyen un control de los parámetros, que puede obviarse si el programador tiene cuidado al llamar a cada función.

Se incluyen algunos parámetros, para poder probar los generadores.

Uniforme - Exponencial - Normal - Triangular - Erlang - Weibull


Distribución Uniforme Continua

Si entre dos números a y b, cualquier subintervalo tiene la misma probabilidad, entonces la variable tiene distribución uniforme.

Los parámetros de la distribución son a y b, dos números reales tales que a<b.

 

function uniforme(a,b:real):double;

begin

if a<b then uniforme:=a+(b-a)*random

else uniforme:=a+b;{ERROR de parametros}

end;

 


Distribución Exponencial

Si la probabilidad de que ocurra un suceso es independiente del tiempo que ha transcurrido desde el último suceso, entonces la variable "tiempo entre sucesos" tiene distribución exponencial.

function exponencial(landa:real):double;

begin

if landa>=0 then exponencial:=-ln(random)/landa

else exponencial:=0; {ERROR}

end;

 


Distribución Normal

Si una variable se puede pensar como la suma de muchas pequeñas variables, cada una de las cuales no incide mucho en el resultado, entonces esa suma es una buena candidata para la distribución normal.

function normal(mu,sigma:real):double;

const pi=3.141592654;

var z,aux1,aux2:double; j:integer;

begin

if (sigma>0) then

begin

aux1:=random;

aux2:=random;

z:=sqrt(-2*ln(aux1))*cos(2*pi*aux2);

normal:=mu+sigma*(z);

end

else normal:=0; {ERROR}

end;


Distribución Triangular

Esta distribución tiene 3 parámetros, a (límite inferior de la variable); b (el modo) y c (límite superior de la variable).

 

function triangular(a,b,c:real):double;

begin

if (a<b) and (b<c) then

begin

if (random<(b-a)/(c-a)) then triangular:=a+(b-a)*sqrt(random)

else triangular:=c-(c-b)*sqrt(random);

end

else triangular:=0;

end;


Distribución Erlang (o Distribución Gamma con parámetro de forma entero)

Si la cantidad de sucesos en un intervalo de tiempo (o de espacio) tiene distribución Poisson con parámetro l (landa), entonces el tiempo hasta que ocurran n sucesos tiene distribución Erlang con parámetros n y l .

 

function erlang(n:integer;landa:real):double;

var aux : double; j: integer;

begin

if (n > 0) and (landa > 0) then

begin

aux:=1; j:=0;

while (j < n) do begin

aux:=aux*random; inc(j);

end;

erlang:=-ln(aux)/landa

end

else erlang:=0; {ERROR}

end;


Distribución de Weibull

La distribución de Weibull se suele utilizar para modelizar tiempos de falla de componentes mecánicos o eléctricos.

Los dos parámetros de la distribución se suelen llamar de forma a (alfa) y de escala b (beta; algunos autores utilizan la letra tita).

 

function weibull(alfa,beta:real):double;

begin

if (alfa>0) and (beta>0) then weibull:=beta*exp(ln(ln(1/random))/alfa)

else weibull:=0; {ERROR}

end;