Generadores de Números para Distribuciones Discretas

 ¬ 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 probar los generadores.

Bernoulli - Binomial - Geométrica - Binomial Negativa - Poisson - Hipergeométrica


Distribución Bernoulli

Si en un experimento hay sólo dos resultados posibles, que podemos llamar "éxito" o "fracaso", donde la probabilidad de éxito es p (un número real entre 0 y 1), entonces la variable "número de éxitos al realizar el experimento 1 vez" tiene distribución Bernoulli con parámetro p.

La siguiente función devuelve números aleatorios 0 o 1, con probabilidad p de devolver el 1.

function bernoulli(p:real):byte;

if (p>0) and (p<1) then

if (random<p) then bernoulli:=1 else bernoulli:=0

else bernoulli:=0;

 


Distribución Binomial

Sea un experimento que consiste en n (entero positivo) pruebas independientes repetidas Bernoulli, donde p (número real entre 0 y 1) es la probabilidad de éxito en cada prueba. Entonces, la variable aleatoria "número de éxitos en las n pruebas" tiene distribución Binomial con parámetros n y p. A la distribución binomial se la suele llamar de las pruebas repetidas con probabilidad constante.

La siguiente función devuelve un número con distribución binomial y parámetros n y p, o cero si los parámetros están fuera de los intervalos permitidos.

function binomial(n:integer;p:real):integer;

var j,k:integer;

begin

if (n>0) and (p>0) and (p<1) then

begin

j:=0;k:=0;

while (j< n) do

begin

if (p>=random) then inc(k);

inc(j);

end;

binomial:=k;

end

else binomial:=0; {ERROR EN LOS PARÁMETROS}

end;


Distribución Geométrica

Se realizan pruebas Bernoulli independientes, cada una con probabilidad de éxito p (número real entre 0 y 1) , hasta que ocurre un éxito. Entonces, la variable "número de fracasos hasta que ocurre un éxito" tiene distribución geométrica con parámetro p.

Si quiero generar la variable "número de pruebas hasta que ocurre un éxito", le debo sumar 1 a la variable.

function geometrica(p:real):integer;

begin

if (p>0) and (p<1) then geometrica:=trunc(ln(random)/ln(1-p))

else geometrica:=0; {ERROR}

end;

 


Distribución Binomial Negativa o Pascal

Se realizan pruebas Bernoulli independientes, cada una con probabilidad de éxito p (número real entre 0 y 1), hasta que ocurren r (entero positivo) éxitos. Entonces, la variable aleatoria "número de fracasos hasta que ocurran r éxitos" tiene distribución binomial negativa con parámetros r y p.

Si quiero generar el "número de pruebas hasta que ocurran r éxitos", le debo sumar r a la variable.

Obsérvese que la distribución geométrica es un caso particular de la distribución Binomial Negativa, con parámetro r=1.

function pascal(r:integer;p:real):integer;

var pruebas,exitos:integer;

begin

if (r>0) and (p>0) and (p<1) then

begin

pruebas:=0; exitos:=0;

while exitos<r do

begin

if (random<p) then inc(exitos); inc(pruebas);

end;

pascal:=pruebas-exitos;

end else

pascal:=0; {ERROR}

end;


Distribución Poisson

Si el tiempo entre sucesos tiene distribución exponencial con parámetro l (landa: número real positivo), el número de sucesos en un intervalo de tiempo fijo tendrá distribución Poisson.

La siguiente función en Delphi devuelve un número con distribución de Poisson, o cero si el parámetro landa está fuera del rango.

function poisson(landa:real):integer;

var aux1, aux2 :double; j:integer;

begin

if landa>0 then

begin

aux1:=exp(-landa); j:=0; aux2:=random;

while (aux2 >= aux1) do

begin

aux2:=aux2*random;

inc(j);

end;

poisson:=j;

end

else poisson:=0; {ERROR EN LOS PARÁMETROS}

end;

 


Distribución Hipergeométrica

Se tienen M (entero positivo) elementos, de los cuales hay k (entero positivo menor o igual que M) que cumplen con una condición, y (M-k) que no la cumplen. Se extraen n (entero positivo menor o igual que M) elementos sin reposición. Entonces, la variable aleatoria "número de elementos extraídos que cumplen la condición" tiene distribución hipergeométrica con parámetros M, k y n.

function hipergeometrica(M,k,n:integer):integer;

var r, x: integer;

begin

if (k<=M) and (n<=M) then

begin

x:=0; r:=0;

while (r< n) and (x< M) do

begin

inc(r);

if (random< (k-x)/(M-r+1)) then inc(x);

end;

hipergeometrica:=x

else hipergeometrica:=0; {ERROR}

end;