Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3.-Generacion de Numeros Aleatorios PDF
3.-Generacion de Numeros Aleatorios PDF
Una vez construido un modelo, debemos experimentar sobre él y para poder ejecutarlo
necesitamos dar valores a las variables de tipo exógeno. De esta forma podremos obtener valores de
salida y pasaremos a realizar un análisis de los mismos. Algunas de las variables de entrada son de
tipo aleatorio por lo que se tendrán que generar valores que simulen dichas entradas. Para generar
variables aleatorias que sigan determinadas funciones de probabilidad necesitamos partir de series de
números que cumplan ciertas características de aleatoriedad. La generación de dichos números es lo
que se va a abordar en este tema.
3.1.- Introducción
Es grande al necesidad de usar números aleatorios y son muchas las aplicaciones que
requieren de ellos, tales como:
siempre que nos refiramos a un número aleatorio estaremos hablando de un número perteneciente a
una serie aleatoria.
Ventajas:
Inconvenientes:
- Lentitud.
Ventajas:
Inconvenientes:
- Lentitud.
52
Generación de números aleatorios
Ventajas:
- Rapidez.
Inconvenientes:
4) Computación digital. Dada una función y una semilla, se van generando los números
aleatorios.
Ventajas:
- Rapidez.
Inconvenientes:
Nosotros, nos vamos a centrar en la utilización de éstos últimos. Por tanto, vamos a entender
por Generador de números aleatorios, un código al que vamos a llamar cada vez que necesitemos una
aproximación a un número aleatorio.
En 1946, Von Neumann propuso un método para obtener números aleatorios de k-cifras, a
partir de una semilla. Dicho método es conocido como Método de los cuadrados centrales.
El problema que presenta este método es que los ciclos se producen rápidamente.
53
Generación de números aleatorios
3.3.1.- Introducción
Hacia 1949, Lehmer introduce un método de generación de números aleatorios mediante el
cual un término de la serie se obtiene como función del término inmediatamente anterior (xn =f(x n-1)).
La función aplicada es la siguiente:
• m, módulo.
Se llama periodo a la subcadena, dentro de la serie generada, en la que no hay repeticiones de
números y longitud de periodo al número de elementos de dicha subcadena.
La repetición de números en la serie puede ser aleatoria, pero dado el método utilizado para la
generación de las mismas, en el momento en el que se repite un valor ya empieza a repetirse todo el
periodo, por lo que interesan métodos que garanticen longitudes de periodo grandes.
54
Generación de números aleatorios
x1 = ( x0 + c ) mod m
x 3 = ( x 0 + 3c ) mod m
y así para todos los términos. Vamos obteniendo que un término es siempre la semilla más un múltiplo
de c y todo módulo m, y esta serie no es aleatoria.
Puede interesarnos dotar de más independencia a los valores obtenidos. Esto lo podemos
conseguir no obteniendo todos los valores consecutivos de una serie sino obteniendo valores de k en k
posiciones, es decir a partir de un elemento xn no obtenemos el elemento xn+1 sino el elemento xn+k.
Para ello tendremos que elegir:
x0 ’=x0
a ’=a k
ak −1
c'= c
a −1
m’=m
En general
ak −1
x n +k = (a k x n + a k −1c + a k − 2c + L + ac + c ) mod m , operando queda : x n +k = (a k x n + c ) mod m ,
a −1
Esto también se puede utilizar para paralelizar la obtención de los términos. Si tenemos un
ordenador con procesamiento paralelo, podemos, partiendo de la semilla asignar a cada procesador la
generación de una subsecuencia de términos. Por ejemplo con tres procesadores se irían generando los
términos de la siguiente forma:
x0
x1 x2 x3
x4 x5 x6
.........................
55
Generación de números aleatorios
Así a partir de un número no tenemos que generar el siguiente término sino el que hay k-
posiciones después de él.
Por otro lado nos interesa que la obtención de la serie se realice de forma rápida. Dado que en
el método que estamos tratando se ha de realizar un módulo, consistente en una división, que es
comparativamente la operación más lenta, podemos encontrar valores de módulo que simplifiquen
dicha operación. Si en un sistema decimal elegimos como módulo m=10k, la operación módulo
aplicada a un número, consistiría simplemente en quedarnos con las últimas k últimas cifras de dicho
número. Al trabajar el ordenador en un sistema binario, la operación se logra realizar con rapidez si se
elige un módulo de la forma m=2 e, y el módulo va a consistir en tomar las e últimas cifras del número.
Uniendo los dos aspectos anteriores nos interesa un elegir como módulo un números de la
forma 2 e y que sea lo más grande posible, siempre y cuando sea posible su representación en el
ordenador. Por tanto si consideramos que w es el mayor número representable, tomaremos un e tal que
2 e sea lo más próximo a w (2 e≤ w).
x n +1 = (ax n + c ) mod m
queda demostrado que la sucesión {yn } es una sucesión congruencial lineal, su periodo
máximo es 2 r , mientras que el periodo máximo de la sucesión {xn } es m=2 e que es un periodo mayor.
Esto significa que las r-últimas cifras de los elementos ciclan más rápidamente.
56
Generación de números aleatorios
Para evitar este inconveniente, si nos interesa que las cifras más bajas se comporten de forma
más aleatoria, podemos tomar como módulo:
para que así se tengan pocos divisores que son los que dan los problemas.
En la mayoría de las aplicaciones, los bits menos significativos no son importantes y es buena
una elección de m=2 e=w.
Si tomamos m de la forma m=P1 ∗P2 ∗....∗Pn (siendo Pi factor primo de m), sólo se obtendrá
periodo máximo con a=1, valor con el que quedaba demostrado que la serie obtenida no era aleatoria.
Se buscará un módulo de la forma m = P1k1 ∗ P2k 2 ∗L ∗ Prk r , lo cual nos permitirá jugar con los valores
de a y c.
Teorema 1.
Para que un generador congruencial lineal mixto genere series con longitud de periodo
máximo m, se deble cumplir:
2) a sea múltiplo de los factores primos de m; a-1=k(P1∗P2 ∗....∗Pr ), siendo Pi factor primo
de m.
Vamos a ver que son amplias las posibilidades de elección de a y c para que se cumpla el
teorema anterior.
Por la primera parte, se ha de cumplir que el mcd(c,m)=±1, luego dado un m se pueden tomar
como posibles valores de c:
n
ϕ ( m) = ∏ ( P − 1) P
i =1
i i
ei −1
Según la segunda parte a-1 debe ser múltiplo de los factores primos de m. Si m=P1 ∗P2
∗....∗Pn , entonces debe ocurrir que a-1=k(P1∗P2 ∗....∗Pn )=km, por otro lado sabemos que a<m:
a < m ⇒ a − 1 < m
⇒ k = 0 ⇒ a =1
a −1 = k m
57
Generación de números aleatorios
Vemos que tomar módulos de esta forma no interesa. Por el mismo razonamiento no interesa
un módulo de la forma m=P.
El resultado anterior nos ofrece el rango de posibles valores para k y de ahí se puede obtener el
número de posibles valores de a.
Si m=2e y e≥2 ⇒ m=k*4, al ser múltiplo de 4 por la tercera condición del teorema se
restringen las posibilidades de a y ahora sólo sirven aquellos valores que garanticen que a-1=k*4.
Como a-1<m, a-1=k’*4<2e ⇒ k’<2 e-2 , que son las posibles elecciones de k’ y por tanto de a.
Teorema 2.
58
Generación de números aleatorios
Las posibilidades de elección de x0 para que se cumpla la primera condición del teorema son
n
ϕ ( m) = ∏ ( P − 1) P
i =1
i i
ei −1
Teorema 3.
1) si p=2 ⇒ si:
a ≠ 0 mod p
• e = 1 ⇒# p −1 / q
a ≠ 1 mod p con q divisor primo de p − 1
#
• e >⇒ p−1
a ≠ 1 mod p
2
Son del tipo x n+1 = ( dxn2 + axn + c ) mod m . La longitud de periodo máxima que se alcanza
con ellos es m, igual que en el caso del G.G.L mixto y sin embargo ha de realizar más operaciones que
éste.
Teorema 4.
2) d y a-1 han de ser múltiplos de todos los factores primos impares de m. (Si m=2 e⇒a-
1=d=1).
3) Si:
d ≡ (a − 1) mod 4
• m = k4 ⇒
d debe ser par
59
Generación de números aleatorios
d ≡ (a − 1) mod 2
• m = k2 ⇒
d debe ser par
4) Si m=k9 ⇒
o bien d ≡ 0 mod 9
ó a ≡ 1 mod 9
cd ≡ 6 mod 9
En este caso la longitud máxima de periodo que se puede alcanzar es mayor, dado que para
que se produzca un ciclo es necesario que se repitan parejas de números.
xn = xn+ k
⇒ longitud máx ima de periodo = m
2
xn −1 = xn−1+ k
El primer generador de este tipo fue creado en los años 1950 y es la sucesión de Fibonacci:
Ofrece una longitud de periodo mayor que m, pero los test han demostrado que los números
producidos no son satisfactoriamente aleatorios.
x n+1 = ( x n + x n− k ) mod m
Demostró que para k≤15 dicho generador no pasaba bien los test de aleatoriedad pero que para
k≥16 sí se portaba bien.
Se ha de cumplir:
60
Generación de números aleatorios
Son muchas las posibilidades para implementar este método. Una de ellas utiliza un array con
55 elementos:
Este algoritmo utiliza el array como si tuviese forma circular, de este modo siempre se tienen
guardados los 55 valores que son necesarios para ir calculando los siguientes. Este es un generador
bastante bueno.
Z n = ( X n + Yn ) mod m .
Utilizando este método el hecho de que se repita un número no implica que la serie empiece a
ciclar, tal y como ocurría con los G.C.L., ya que ahora interviene otro número de otra serie.
No es conveniente utilizar el mismo método para generar las dos series de partida.
61
Generación de números aleatorios
3.4.4.1.- Mezcla I
Fue introducido por Mclaren y Marsaglia. Este método utiliza dos series de números
aleatorios. La idea es utilizar un generador para permutar la salida producida por otro generador. De
esta forma se consigue enmascarar la dependencia funcional que existe entre un número y el siguiente
dentro de una serie generada. Dados dos métodos (o series ya generadas) {Xn } e {Yn } el método
produce una sucesión más aleatoria mediante permutaciones en la primera ocasionadas utilizando la
segunda (se obtienen los valores de la primera pero en un orden diferente).
Proceso:
Partimos de dos series {Xn } e {Yn } y vamos a desordenar a primera con la ayuda de la
segunda.
El módulo tomado para la generación de las series no tiene por qué ser el mismo. Vamos a
suponer que el módulo utilizado para la generación de la primera es m y para la generación de la
segunda es m’, por lo que 0≤xi <m y 0≤yi <m’ ∀ i.
Tomamos los k primeros elementos de la primera serie (desde x0 hasta xk-1 ) y los almacenamos
en un array. Ahora con un elemento de la segunda serie tendremos que seleccionar uno de los
ky
elementos del array, para ello tomamos el elemento y0 y obtenemos la posición j = E 0 (se hace
m'
esta transformación dado que los elementos de la segunda serie están en el intervalo [0, m’-1] y las
posiciones del array van desde la 0 hasta la k-1). El valor almacenado en el array en dicha posición j
va a ser el elemento de la nueva serie que vamos generando y el hueco dejado por él se sustituye con
el siguiente elemento no almacenado de la primera serie, el xk . El proceso se va repitiendo tomando
cada vez el siguiente elemento de la segunda serie para seleccionar posición y rellenando ésta con el
siguiente de la primera serie.
De esta forma se obtienen los elementos de la primera serie, pero reordenados con la ayuda de
la segunda con lo que se está dotando de más independencia a los mismos.
Algoritmo:
62
Generación de números aleatorios
3.4.4.2.- Mezcla II
Fue introducido por Carter Bays y Durham. Es un método parecido al anterior a diferencia de
que sólo utiliza una serie de números {Xn }. Mejora la aleatoriedad de la serie original con un costo
muy pequeño.
Proceso:
En este caso partimos de sólo de una serie {Xn } y vamos a desordenarla utilizando los
elementos de la misma serie.
Vamos a suponer que el módulo utilizado para la generación de la serie es m por lo que
0≤xi <m ∀ i.
Tomamos los k primeros elementos de la serie (desde x0 hasta xk-1 ) y los almacenamos en un
array. Ahora con el siguiente elemento no utilizado tendremos que seleccionar uno de los elementos
kx
del array, para ello tomamos el elemento xk y obtenemos la posición j = E k (se hace esta
m
transformación dado que los elementos de la serie están en el intervalo [0, m-1] y las posiciones del
array van desde la 0 hasta la k-1). El valor almacenado en el array en dicha posición j va a ser el
elemento de la nueva serie que vamos generando. El hueco dejado por él no lo rellenaremos con el
elemento utilizado para seleccionar la posición dado que si así lo hiciésemos elementos pequeños
seleccionarían posiciones bajas del array que se irían completando con dichos elementos y los
elementos grandes se irían a posiciones altas en el array, quedando por tanto el array ordenado en
cierta manera. Para evitar esto que quitaría aleatoriedad a la serie que se está generando, lo que
hacemos es utilizar el elemento xk+1 (no utilizado hasta el momento para rellenar el elemento dado
como salida) y en pasos siguientes se va utilizando el elemento dado como salida para seleccionar la
siguiente posición en el array y el hueco dejado tras la salida se va completando con el siguiente
elemento no utilizado de la serie.
De esta forma se obtienen los elementos de la serie pero en desordenados, con lo que se está
dotando de mayor independencia a los mismos.
Algoritmo:
63
Generación de números aleatorios
jßj+1
V[h]ßxj
Fin_mientras
b/a (b es divisor de a)
3) Dados a, b ∈ Z+ se llama mcd(a,b)=c (máximo común divisor) tal que c/a y c/b y si ∃ d ∈
Z+ tal que d/a y d/b ⇒ d/c.
4) Dados a, b ∈ Z+ se llama mcm(a,b)=c (mínimo común múltiplo) tal que a/c y b/c y si ∃ d
∈ Z+ tal que a/d y b/d ⇒ c/d.
6) Se define ψ(m) (Phi de Euler) de m, como la función que nos dice el número de primos
relativos con m. ψ(m)=m-1 para m primo.
n
m= ∏P
i =1
i
ei
, con P primo
8) Dado cualquier m
n
ϕ (m ) = ∏ ( P − 1) P
i =1
i i
ei −1
,
•
9) a es congruente con b módulo m (a≡b) si a − b = m
64
Generación de números aleatorios
11) Llamamos orden de a módulo m al menor λ∈Z+ que hace cierto a λ≡1modm. Se llama
orden de m (λ(m)) al máximo de los órdenes de los posibles a’s. Se dice que a es raíz
primitiva módulo m cuando su orden coincide con el orden de m.
65