GENERACIÓN DE NÚMEROS ALEATORIOS ........................................................... 2 GENERACIÓN A PARTIR DE LA NATURALEZA................................................ 2 UTILIZACIÓN DE TABLAS DE NÚMEROS ALEATORIOS ................................. 3 MÉTODO DEL CUADRADO MEDIO....................................................................... 4 MÉTODO CONGRUENCIAL LINEAL (MULTIPLICATIVO) ................................ 6 MÉTODO CONGRUENCIAL MULTIPLICATIVO PURO ...................................... 7 GENERACIÓN DE NÚMEROS ALEATORIOS Desde que se empezaron a utilizar los ordenadores ha habido gran interés en simular diferentes fenómenos. Para ello era necesario disponer de números que se generaran al azar y ha habido muchos intentos de conseguir métodos que permitieran hacer esto con sencillez y rapidez. A continuación se describen algunos de los principales métodos utilizados a lo largo de la historia para generar números pseudoaleatorios. GENERACIÓN A PARTIR DE LA NATURALEZA Dado que los fenómenos de la naturaleza se generan normalmente al azar, una de las primeras ideas que se les ocurrieron a los científicos, que trataban de simular modelos, consistió en utilizar acontecimientos naturales para obtener valores en las pruebas realizadas mediante computadores. Las denominadas "semillas" se obtenían a partir de algún fenómeno aleatorio de la naturaleza y a partir de ella se obtenían el resto de valores para iniciar el proceso de simulación. La principal deficiencia que tiene este método es que no nos permite volver a generar un valor obtenido con anterioridad para repetir un experimento. Recuérdese una de las características que distinguen a los experimentos en la ciencia es que puedan repetirse de manera que un investigador pueda repetir un experimento realizado por otro con el fin de contrastar los resultados obtenidos por ambos. Sin embargo, esta no es una razón excesivamente convincente ya que fácilmente puede guardarse la semilla para volver a realizar el experimento. Si el experimento no puede repetirse en las mismas condiciones establecidas, entonces la ciencia no lo considera un experimento y por lo tanto no es un experimento científico. Hoy en día los métodos naturales no se utilizan para generar semillas para los experimentos. Entre otras razones, podemos destacar las siguientes: La semilla que genera el método natural no es necesariamente una buena semilla, es decir, existen semillas que generan buenas secuencias pseudoaleatorias y semillas fatales, en el sentido de que la secuencia es excesivamente corta. Por otro lado, estos métodos son caros y no suponen ninguna ventaja. Por ello hoy en día no tiene justificación su uso. UTILIZACIÓN DE TABLAS DE NÚMEROS ALEATORIOS Este método se utilizó hasta que los investigadores tuvieron la oportunidad de utilizar ordenadores para la generación de números pseudoaleatorios. A partir de entonces han quedado en desuso lo mismo que les ha ocurrido a las, muy utilizadas, tablas de logaritmos. Una de las más famosas de estas tablas, para obtener números aleatorios, es la de la empresa RAND editada en 1955. MÉTODO DEL CUADRADO MEDIO Este método fue utilizado por primera vez por John (János) von Neumann (Budapest Hungría diciembre de 1903- muere de cáncer en Washington el 8 de febrero de 1957) para la obtención de números pseudoaleatorios mediante computador. El método consiste en utilizar un número del intervalo 1 a 99999999. De este número se escogen un máximo de cuatro cifras del siguiente modo: Si el número es menor o igual que 9999 entonces se escoge ese número. Si el número tiene 5 cifras, se escogen las cuatro de la izquierda. Si el número tiene 6, 7 u 8 cifras, se escogen las cuatro que se encuentran a la izquierda de las centenas. Una vez escogido el número, se eleva al cuadrado y para obtener el siguiente se vuelven a escoger cuatro números tal como se ha indicado anteriormente. Su interés es meramente histórico ya que actualmente no se utiliza por generar secuencias de periodo muy pequeño. A continuación mostramos los resultados que deben obtenerse para cada uno de los números mostrados en la columna de la izquierda: 4443 9989 88 10000 10023 99989 100001 999999 1000001 7898776 99909967 93412527 3412546 412578 99999971 4443 9989 88 1000 1002 9998 1000 9999 0 8987 9099 4125 4125 4125 9999 A continuación mostramos cómo pueden obtenerse las cifras centrales. Function num_centro(n) If n <= 9999 Then num_centro = n ElseIf n <= 99999 Then num_centro = n \ 10 ElseIf n <= 999999 Then num_centro = n \ 100 Else n = n \ 100 num_centro = n - (n \ 10000) * 10000 End If End Function Veamos otra forma de hacerlo tratando los números como cadenas y como números, con la intención de que resulte algo más sencillo. Function cifras_centro(x) longitud = Len(x) If longitud <= 4 Then cifras_centro = x ElseIf longitud = 5 Then cifras_centro = x \ 10 ElseIf longitud = 6 Then cifras_centro = x \ 100 ElseIf longitud = 7 Then cifras_centro = resto(x) \ 100 Else cifras_centro = resto (resto(x)) \ 100 End If End Function Function resto(x) resto = Mid(x, 2) End Function Ejercicio: Escribir un procedimiento que utilizando una semilla situada en una celda de la hoja, genere en una columna la secuencia de valores proporcionados por este método. Después de generada una columna con suficientes números, calcular el periodo de la secuencia obtenida. MÉTODO CONGRUENCIAL LINEAL (MULTIPLICATIVO) En esta sección consideraremos métodos para generar una secuencia de fracciones aleatorias, es decir, números aleatorios reales, Un, distribuidos uniformemente entre cero y uno. Ya que un computador puede representar un número real con precisión limitada, en realidad deberíamos generar números enteros, Xn, entre 0 y algún número m; la fracción Un Xn m Proporcionará valores entre cero y uno. Normalmente el m es el tamaño de la palabra de la memoria del computador, por lo que Xn puede considerarse como el contenido entero de una palabra del computador con el punto decimal en el extremo derecho y Un puede considerarse como el contenido de la misma palabra suponiendo el punto decimal en el extremo izquierdo. Con gran diferencia, el método más popular para generar números aleatorios sigue el siguiente esquema debido a D.H.Lehmer1 en 1949. X n 1 (aXn c) mod m Donde todos los valores utilizados son enteros n m a c Xo índice de la sucesión módulo multiplicador incremento valor inicial n≥0 m>0 0≤a<m 0≤c<m 0 ≤ Xo < m Por ejemplo, la secuencia que obtendríamos utilizando los siguientes valores m a c Xo módulo multiplicador incremento valor inicial 10 7 7 7 Para obtener los sucesivos valores de la sucesión puede utilizarse la siguiente función, codificada en VBA, para representar la expresión anterior. Function gen(a, Xn, c, m) gen = (a * Xn + c) Mod m End Function 1 Proc. 2nd Symp. on Large-Scale Digital Calculating Machinery. Cambridge: Harvard University Press, 1951, pag 141-146. MÉTODO CONGRUENCIAL MULTIPLICATIVO PURO Es un caso particular del método anterior en el que se usa c igual a 0. Se ha utilizado bastante con la idea de ahorrar tiempo de cálculo al evitar la suma. Por ejemplo: m a c Xo módulo multiplicador incremento valor inicial 65535 7 0 12345 También se suele utilizar el módulo: m 216 3 Los valores que nosotros utilizaremos utilizan el módulo siguiente: m 232 1 2.147.483.647 Y como multiplicador usaremos el siguiente valor de a: a 216 3 65.539