Generadores de Números para Distribuciones Continuas
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;
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;
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;
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;
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;