Generadores de Números U(0,1)
¬ Principal
La mayoría de los lenguajes de programación tienen incorporada una función para generar números aleatorios, con distribución uniforme en el intervalo (0,1). Esta función es la base de la generación de números aleatorios con otras distribuciones. Como en realidad estos números se generan a partir de una relación de recurrencia puramente determinística, no son números aleatorios sino determinísticos. Pero, a los fines de la simulación, esto no es importante si parecen aleatorios. Por eso a estos números se los llama a veces seudoaleatorios.
En el caso de Delphi, se trata de la función
random (sin argumentos), la que devuelve números de tipo real. Si coloca el argumento rango, generará números enteros desde 0 hasta rango-1.Para inicializar (comenzar) la generación de números, utilice la función
randomize (sin argumentos). Pero si desea una secuencia de números que luego pueda replicar, utilice para inicializar la función randseed(semilla), donde semilla será el número inicial (de tipo longint, hasta 2147483647) para la secuencia.Vea la ayuda o lea el manual de su lenguaje sobre la función random y sus relacionadas. Luego:
Haga un programa que publique los números aleatorios del generador de su lenguaje.
Datos de Entrada: Cantidad de números a generar, Opción para grabar los números como archivo de texto o de otro tipo, Inicializar semilla.
Datos de Salida: Lista de números, o Archivo
Es posible (aunque improbable), que su lenguaje no tenga un generador de números aleatorios. También es posible que quiera que su trabajo de investigación pueda ser replicado por otras personas, utilizando otro lenguaje.
En ese caso, no debe preocuparse. Existen generadores portátiles de números aleatorios con distribución uniforme. Aquí se da uno congruencial mixto y uno congruencial multiplicativo.
Generador Congruencial Mixto
El código en Delphi es:
function aleat:double; {GENERADOR PORTATIL MIXTO de NAYLOR}
const a=129; c=1; modulo=34359738368;
begin
semilla:=((a*semilla +c) mod modulo);
aleat:=semilla/modulo;
end;
Generador Congruencial Multiplicativo
El código en Delphi es
function aleat:double; {GENERADOR PORTATIL MULTIPLICATIVO}
const a=16807; modulo= 2147483647; {modulo es un numero primo}
begin
semilla:=((a*semilla) mod modulo);
aleat:=semilla/modulo;
end;
La función
mod es el módulo de la división. Significa encontrar el resto de la división entre (a*semilla +c) y modulo. Este resto será un número comprendido entre 0 y el módulo.La variable
aleat, entonces, al dividirse por modulo, será un número comprendido entre 0 y (modulo-1)/modulo; digamos que casi 1.La variable
semilla debe ser inicializada: se le debe dar un valor, fuera de la función. Elija cualquier número entre 0 y módulo-1. Cuando quiera que el generador le dé la misma sucesión de números, asígnele el mismo valor inicial.