Sei sulla pagina 1di 9

Cap tulo 3 Generacin de nmeros aleatorios o u U (0, 1).

3.1.
3.1.1.

Generacin de nmeros aleatorios U (0, 1) o u


Introduccin o

Nos planteamos el problema de cmo generar nmeros aleatorios independientes y o u uniformemente distribuidos en el intervalo (0, 1) que sean tiles para ser usados en un u mtodo Monte-Carlo. Lo primero que hemos de tener en cuenta es que en un ordenador e un nmero real no viene dado por una precisin innita, sino que el nmero de deciu o u males esta jado por la longitud de la palabra del ordenador. De manera que aqu nos limitaremos a explicar tcnicas para generar nmeros reales de la forma m/M donde e u m representa un nmero entero distribuido uniformemente en el intervalo [0, M 1]. u 1 Cuanto mayor sea M, mejor ser la aproximacin de los nmeros obtenidos a una a o u 1). Una manera de obtener dichos nmeros m ser disponer verdadera distribucin U(0, o u a de una gran caja con M bolas numeradas de 0 a M 1. Una mano inocente extraer a una bola marcada con un nmero m; a continuacin, se devolver la bola a la caja, se u o a revolver bien las bolas y se extraer otro nmero, ... etc. Esto producir una verdaan a u a dera secuencia de nmeros aleatorios independientes. Sin embargo, debiera de ser claro u que tal procedimiento no es prctico (aunque de hecho se, si tomamos M = 2b se podr a a reducir el nmero de bolas en la caja a 2 y sacar b bolas para formar la representacin u o binaria del nmero). En su lugar vamos a disear algoritmos numricos deterministas u n e que producen una secuencia de nmeros enteros entre 0 y M 1 que va a parecer aleau toria. Esto es lo que se conoce como un generador de nmeros pseudoaleatorios. Como u curiosidad histrica podemos citar el mtodo de Von Neumann para producir nmeros o e u pseudoaleatorios entre 0 y 9999. Se parte de un nmero cualquiera inicial (llamado seu milla) m0 (0, 9999), se eleva al cuadrado, se suprimen las dos ltimas cifras y se u tomas la cuatro ltimas del nmero que queda. Veamos un ejemplo: u u m0 = 5232 m2 = 27373824 m1 = 3738 0
En algunas ocasiones y para evitar algunos problemas de precisin que pueden surgir al calcular o funciones logaritmo, es conveniente escribir el nmero aleatorio real como el cociente (m+0.5)/M. u
1

42

Generacin de nmeros aleatorios U (0, 1) o u

m2 = 9726 m2 = 94595076 m3 = 5950 2

m1 = 3738 m2 = 13972644 m2 = 9726 1

Esto producir la secuencia x0 = 0,5232, x1 = 0,3738, x2 = 0,9726, x3 = 0,5950, .... a La pregunta es si esta secuencia puede aparecer, a alguien que no sepa como se ha generado, como una verdadera secuencia aleatoria. Es decir, si puede pasar una serie de tests estad sticos que caracterizan a una verdadera secuencia aleatoria. No entraremos aqu en la multitud de tests que se han propuesto para comprobar si una secuencia de nmeros pseudoaleatorios tiene propiedades estad u sticas aceptables. Mencionaremos nicamente dos de estos tests: u 1. Momentos. Se ha de vericar que xn = (n + 1)1 . i 2. Correlaciones. Se ha de vericar que xi xj = 0,25 si i = j. Observemos que el generador de Von Neumann (y en otros que veremos) se caracteriza por ser c clico. Es decir, si mi = m0 para algn nmero i, entonces la secuencia se u u repite. Una secuencia con ciclo largo es mucho ms fcil que satisfaga razonablemente a a la primera de las dos condiciones mencionadas. Resulta que el generador de Von Neumann puede, dependiendo de la semilla, generar secuencias demasiado cortas. Adems, a si un nmero mi resulta ser pequeo, los nmeros siguientes son tambien pequeos, de u n u n manera que no se verica la propiedad de independencia estad stica. Qu propiedades han de ped e rsele a un buen generador de nmeros pseudoaleatorios? u Son esencialmente las siguientes: 1.- Buenas propiedades estad sticas. El generador ha de pasar una serie de tests estad sticos, aunque siempre se consigue encontrar algn test que el generador no u consigue superar. 2.- Eciencia en la generacin. Una moderna simulacin usa una gran cantidad o o de nmeros aleatorios (a vecer se necesitan del orden de 1012 nmeros) y es necesario u u que el generador sea eciente para que no se gaste demasiado tiempo en la generacin o de esos nmeros. u 3.- Periodo largo. Ya hemos dicho que es necesario generar muchos nmeros u aleatorios en cualquier simulacin. Si agotamos el periodo de los nmeros aleatorios o u obtenemos una secuencia en la que cada nmero se ha generado una y una sola vez, de u manera que est lejos de ser una verdadera secuencia aleatoria. Una regla es que no hay a que usar ms qeu M nmeros en la simulacin, lo que exige que el generador tenga a u o un periodo muy largo. 4.- Reproducibilidad. Esta propiedad puede parecer paradjica. ?Para qu se quieo e re que los nmeros aleatorios (que se supone que son al azar) se puedan reproducir. Esto u es importante, sobre todo, en la fase de desarrollo de los programas porque es muy dif cil intentar depurar un programa que nos da cada vez resultados diferentes.

3.1 Generacin de nmeros aleatorios U(0, 1) o u

43

3.1.2.

Generadores Congruenciales

Los generadores congruenciales utilizan una relacin recurrente del tipo: o mi+1 = F (m0 , m1 , ....mi ) mod (M) (3.1)

Es claro que, debido a la funcin mod (M) slo nmeros entre 0 y M 1 son generados. o o u Se han propuesto funciones F (m0 , m1 , ....mi ) muy complicadas (como la del algoritmo de Von Neumann, que es mi+1 = [m2 /100] mod 10000. Sin embargo, parece que i buenas secuencias pseudoaleatorias pueden obtenerse mediante los llamados generadores congruenciales que utilizan la sencilla frmula de recursin lineal: o o mi+1 = (ami + c) mod (M) (3.2)

Fijmonos que una relacin del tipo mi+1 = F (mi ) mod (M) nunca podr pasar e o a todos los tests de una verdadera secuencia aleatoria, ya que necesariamente se repite al cabo de M iteraciones, como mximo. Adems, la probabilidad de que mi+1 = mi a a es 0 (o 1 en el caso ms desfavorable de que mi sea un punto jo de la aplicaci`n). a o Esto contrasta con el caso ideal de la caja en la que la probabilidad de que una bola salga dos veces consecutivas es 1/M. Sin embargo, si M es sucientemente grande esta probabilidad es pequea. Notemos, adems, que el carcter determinista de (7.1) se n a a pone de maniesto si escribimos la solucin de dicha ecuacin de recurrencias: o o mi = m0 c 1a ai + c mod (M) 1a (3.3)

Hay dos casos bien diferenciados dependiendo de si la constante c es igual o diferente de 0. En el primer caso c = 0 se habla de generadores congruenciales mixtos. Si c = 0 se habla de generadores congruenciales multiplicativos. 3.1.2.a. Generadores Congruenciales Mixtos

Una propiedad que parece importante exigir a la secuencia mi denida por la anterior relacin lineal es que tenga periodo mximo, es decir: que se repita slo al cabo de M o a o iteraciones. Se puede demostrar que el periodo mximo M se alcanza si y slo si: a o (i) c es primo con M. (ii) a=1 mod g, para cada divisor primo g de M (iii) a=1 mod 4 si M es mltiplo de 4. u Es til en los clculos por ordenador escoger el nmero M de la forma M = 2b ya u a u que as la operacin mdulo (que en general involucra una divisn, una multiplicacin y o o o o una resta) puede hacerse fcilmente poniendo a cero todos los bits de la representacin a o 6 binaria del nmero entero excepto los b ltimos. As por ejemplo, 876487 mod 2 es u u , 6 11010101111111000111 mod 2 = 000111. Discutiremos brevemente con un ejemplo cmo funciona la operacin mdulo en el caso de M = 24 = 16 (ser un ordenador o o o a

44

Generacin de nmeros aleatorios U (0, 1) o u

de 4 bits). El problema es que a veces el clculo de mi+1 produce un overow que no a importa a la hora de calcular la operacin mdulo si admitimos que el resultado puede o o ser negativo. Lo nico que hay que tener en cuenta entonces es que hay que aadir 1 al u n nmero aletorio resultante para que est en el intervalo (0, 1). Tomemos c = 1, a = 5 u e (esto produce un per odo mximo). Tomemos la semilla m0 = 0. Tenemos la secuencia: a m0 = 0 = m1 = 1 = m2 = 6 = m3 = 31 = m4 = 4 = m5 = 19 = m6 = 14 = 0000 r0 = 0/16 0001 r1 = 1/16 0110 r2 = 6/16

11111 = 1111 debido al overow = 1 r3 = 1/16 + 1 = 15/16 1100 r4 = 4/16 + 1 = 12/16 1101 = 3 r5 = 3/16 + 1 = 13/16 10010 = 0010 = 2 r6 = 2/16

etc. En este caso de M = 2b las condiciones anteriores se traducen en que (i) c ha de ser impar i (ii) a = 1 mod (4). Esto asegura un periodo mximo. El conseguir buenas a propiedades estad sticas ya es ms complicado. Mencionares sencillamente que un buen a generador es dado por los nmeros: u M = 235 = 34359738368; Otra serie de nmeros son los siguientes: u M = 232 = 4294967296; a = 69069; c=1 (3.5) a = 27 + 1 = 129; c=1 (3.4)

que, aunque no son la mejor eleccin posible, son fciles de recordar (es el generador o a utilizado en el VAX). Kalos menciona como un buen generador el que utiliza: M = 232 ; a = 1812433253; c=1 (3.6)

y da, adems, evidencia de que se pasan acertadamente algunos tests estad a sticos. Vamos a dar una implementacin de la funcin rand(iseed) que genera un nmero o o u pseudoaleatorio uniformemente distribuido entre 0 y 1 usando el algoritmo precedente utilizando el que estamos en un ordenador de 32 bits. function rand(iseed) parameter (rm=2.0**-32) parameter (ia=1812433253, ic=1) iseed=iseed*ia+ic rand=rm*iseed if (rand.lt.0.0) rand=1.0+rand return end

3.1 Generacin de nmeros aleatorios U(0, 1) o u

45

Para que este programa funcione es imprescindible el que el ordenador no detecte el overow que puede existir en la multiplicacin entera. En VMS esto se consigue o compilando con la opcin /check=nooverow. Para otros ordenadores puede ser preciso o trabajar en aritmtica real de doble precisin (que tiene la desventaja de ser ms lento). e o a As escribir amos: function rand(iseed) double precision (ia,ic,iseed,m,rm) parameter (m=2.0d0**32,rm=1.0d0/m) parameter (ia=1812433253.0d0, ic=1.0d0) iseed=mod(iseed*ia+ic,m) rand=rm*iseed return end (cuidado con los tipos de datos al usar este algoritmo). 3.1.2.b. Generadores Congruenciales Multiplicativos

Los generadores congruenciales puramente multiplicativos, aqullos que tienen la e constante c = 0. Son ms fciles de generar y suelen tener iguales propiedades estad a a sticas que los aditivos. Un problema es que no pueden alcanzar el ciclo mximo M. Sin a embargo, esta desventaja no lo es en la prctica porque un periodo casi mximo de a a longitud M 1 puede alcanzarse si (condicin suciente, no necesaria): o (i) M es primo. (ii) a es una ra primitiva de M. Es decir: aM = 1 mod M, pero an = 1 mod M, n < z M. Adems, este periodo casi mximo se alcanza independientemente del valor de la a a semilla m0 . Un valor muy conveniente de usar es el de M = 231 1 (nmero primo u de Mersenne), que es adems el nmero postivo mayor que puede representarse en un a u ordenador de 32 bits. Para este nmero M, se han propuesto los siguientes valores para u el multiplicador a = 75 = 16807 (es aceptable para la mayor de problemas); a = a 742938285 (ste es el mejor valor segn el criterio de lEcuyer ([6]); a = 69069 (aunque e u este nmero estuvo de modadurante un tiempo, no parece ser la mejor eleccin). u o Otras parejas de valores que se han propuesto y que satisfacen las condiciones anteriores para tener un periodo casi mximo son: M = 2147483563, a = 40014 y a M = 2147483399, a = 40692. La ventaja de estos nmeros es que permiten realiu zar la operacin mdulo sin que nunca se encuentre overow en un ordenador de o o un 32 bits. Esto es posible porque se verica que a < m. En la prctica, esto se hace a dndose cuenta de que 40014 m mod 2147483563 es equivalente a a k=m/53668 m=40014*(m-k*53668)-k*12211 if (m.lt.0) m=m+2147483563

46

Generacin de nmeros aleatorios U (0, 1) o u

y 40692 m mod 2147483399 es equivalente a k=m/52774 m=40692*(m-k*52774)-k*3791 if (m.lt.0) m=m+2147483399 Lecuyer tambin ha demostrado cmo usar una combinacin de estos dos generadores e o o para generar un nmero aleatorio cuyo periodo es el producto de los periodos de cada u uno de los dos generadores. Esto da lugar a su generador RANECU cuyo periodo es (1) aproximadamente 4 1018 . El algoritmo propuesto toma un nmero mi del primer u (2) generador y otro mi del segundo y los resta corrigiendo el hecho de que la resta pueda ser negativa: (1) (2) mi = mi mi if mi < 0 mi = mi + 2147483562 El nmero aleatorio viene dado por: u ri = mi 4,665613 1010 Por los motivos explicados con anterioridad ser til poder usar un nmero de la a u u b forma M = 2 , pero entonces no se satisfacen las condiciones necesarias para obtener un periodo M 1. En este caso de M = 2b , se puede demostrar que el periodo mximo a del generador congruencial multiplicativo es M/4, y se alcanza cuando a = 8r 3 donde r es cualquier nmero positivo y cuando la semilla m0 es un nmero impar. Una u u buena seleccin es en este caso, M = 235 , a = 217 + 3. Otros valores propuestos o son M = 232 , a = 69069 (otra vez, su principal ventaja es que es fcil de recordar); a 32 M = 2 , a = 1664525 (el mejor, segn el criterio de Knuth ([7]); M = 247 , a = 515 u (un nmero conveniente para la arquitectura de los enteros en los ordenadores CDC u y que, adems, tiene un periodo muy largo). Mencionaremos, por ltimo, la pareja a u M = 229 , a = 65539 que dio lugar al generador RANDU, implementado hace tiempo por IBM en sus ordenadores y que resulto tener propiedades estad sticas particularmente malas.

3.1.3.

El Teorema de Marsaglia

En un interesante art culo titulado Random Numbers Fall Mainly in the Planes ([8]), Marsaglia demostr que todos los generadores congruenciales tienen correlacions cuando o se consideran en un espacio d-dimensional con d sucientemente alto. Esto quiere decir que si consideramos los puntos (x1 , x2 , ..., xd ) caen en hiperplanos de dimensin d 1. o

3.1.4.

Generadores FSR

Los generadores FSR (Feedback Shift Register) generan secuencias de nmeros u pseudoaletorios zi binarios, (que son 0 1). A partir de aqu se puede construir un o

3.1 Generacin de nmeros aleatorios U(0, 1) o u

47

nmero entero de b bits sin ms que juntar b de estos nmeros. Estn basados en la u a u a recurrencia: zi = c1 zi1 + c2 zi2 + ... + cn zin mod 2 (3.1) donde ci = 0, 1 es una conjunto de n constantes binarias. Es claro que esta secuencia de zi ha de repetirse necesariamente despus de 2n valores, de manera que el periodo e n mximo es 2 . Para que el periodo sea exactamente 2n 1 es necesario y suciente que: a f (z) = 1 + c1 z + c2 z 2 + ... + cn z n (3.2) sea primitivo en GF(2) (Gaulois eld). O sea, que no se pueda escribir f (z) = f1 (z)f2 (z) (todas las operaciones mdulo 2). o Las relaciones ms sencillas se basan en polinomios del tipo: a f (z) = 1 + z q + z p Que reducen la relacin de recurrencia a la forma: o zi = zip + ziq mod(2) (3.4) (3.3)

Si consideramos que zi son variables lgicas, podemos escribir esta ecuacin como: o o zi = zip ziq (3.5)

Donde es la operacin o exclusivo (recordemos brevemente la tabla: 00 = 0, 01 = o 1, 0 1 = 1, 1 1 = 0. Aunque no es estndard en el lenguaje fortran, la mayor de a a compiladores la incluyen en sus librer ya que esta operacin es una de las fundaas, o mentales en el lenguaje ensamblador y es muy rpida. El algoritmo necesita p valores a iniciales z1 , z2 , ..., zp que han de ser generados aleatoriamente mediante otro generador o ser dados en forma de tabla (hay que tener un cierto cuidado para evitar correlaciones entre estos valores iniciales). Hay dos maneras de utilizar un generador FSR. En la primera se toman los valores de zi producidos en grupos de b y se forma con ellos una secuencia de b bits que se considera entonces como un nmero entero entre 0 y 2b 1. u Esta implementacin es incmoda de programar. Una implementacin ms frecuente es o o o a (1) (2) (b) la de considerar inicialmente p nmeros enteros de b bits mi = z1 zi ...zi , i = 1, ..., p u y utilizar la relacin de recurrencia mi = mip miq en la que la operacin se realiza o o bit a bit. Una eleccin que ha resultado ser adecuada es p = 250, q = 103 (el llamado generao dor R250), aunque han surgido dudas recientemente sobre la validez de este generador para ciertos problemas. El periodo es 2250 1,8 1075 que es sucientemente grande para la mayor de aplicaciones. Hemos de hacer notar que los generadores FSR sufren a de los mismos problema derivados de la existencia de planos de Marsaglia en un espacio d-dimensional. Otra eleccin que se ha usado es p = 1279, q = 1063. o

3.1.5.

Generadores de Fibonacci
mi = (mip miq ) mod M (3.1)

Los generadores de Fibonacci utilizan la relacin: o

48

Generacin de nmeros aleatorios U (0, 1) o u

Donde la operacin es o una resta o una suma o un o exclusivo. Si se utilizan restas o o sumas hay una mezcla de los bits que no hay cuando se utiliza el o exclusivo (que da lugar a los generadore FSR) y se arma que las propiedades estad sticas son mejores.

3.1.6.

Generador RCARRY

James, basado en ideas de Marsaglia et al, ha propuesto el generador que el llama RCARRY. La idea es utilizar una secuencia del tipo de Fibonacci, pero con una substracci adicional en el caso de que el resultado de la substraccin anterior fuera negativo. El n o algoritmo dice: mi = mir mis ci mod(M) Donde r > s y el resto ci es igual a 1 si mi 1 fue negativo (antes de hacer la operacin o mdulo) e igual a 0 en caso contrario. La operacin resta mezcla los diferentes bits del o o nmero entero y la consideracin del resto ci destruye muchas de las correlaciones en la u o secuencia de nmeros. Para inicializar el algoritmo es necesario dar una secuencia inicial u de r nmeros mi , i = 1, ..., r. Una eleccin conveniente es M = 224 , r = 24, s = 10, u o el periodo de este generador es entonces 48 veces menor que el nmero de diferentes u estados que se pueden representar mediante 24 nmeros de 24 bits, que es (224 )24 . De u manera que el periodo para el generador dado es 2570 10171 .

3.1.7.

Conclusin o

El lector puede estar asustado de comprobar cuantos generadores aleatorios hay y estar tentado a pensar, como as es, que ninguno de ellos es sucientemente bueno (si lo fuera, no se explicar ms que se). La verdad es que cada generador tiene su debilidad a a e que se muestra en algn test estad u stico. Recientemente [10] se ha aadido lea al fuego n n con la constatacin de que nmeros bien establecidos no dan correctamente la energ o u a del modelo de Ising. Este tema est an sub judice. a u

3.1 Generacin de nmeros aleatorios U(0, 1) o u

49

Ejercicios
1. Programar el algoritmo de von Neumann. Generar 1000 nmeros usando ese algou 2 ritmo y calcular los valores esperados x , x y la correlacin xi xi+1 . Dependen o los resultados de la semilla m0 ? 2. Tomad el generador de nmeros aleatorios que viene incorporado a vuestro comu pilador favorito y comprobad si el per es superior a 232 4,3 109 . Generar do 106 nmeros usando ese algoritmo y calcular los valores esperados x , x2 y la u correlacin xi xi+1 . Dependen los resultados de la semilla m0 ? o 3. Programar el algoritmo de Lecuyer para generar nmeros aleatorios segn el geneu u 6 rador RANECU. Generar 10 nmeros usando ese algoritmo y calcular los valores u esperados x , x2 y la correlacin xi xi+1 . Dependen los resultados de la seo milla m0 ? 4. Implementar el algoritmo R250 para generar nmeros aleatorios. Generar 106 nmeu u 2 ros usando ese algoritmo y calcular los valores esperados x , x y la correlacin o xi xi+1 . Dependen los resultados de la semilla m0 ? 5. Calcular numricamente la dimensin de los planos de Marsaglia para el generador e o RAND del VAX y el generador R250. 6. Un famoso problema arma que al escoger tres nmeros a, b, c, al azar en el u intervalo (0, 1), la probabilidad de que la ecuacin de segundo grado ax2 +bx+c = o ln(2) 5 0 tenga soluciones reales es 36 + 6 0,254. Utilizad vuestro generador de nmeros uniformes favorito para conrmar este resultado. u

Potrebbero piacerti anche