Está en la página 1de 19

MÉTODOS PARA GENERAR NÚMEROS PSEUDO-ALEATORIOS

1. GENERADORES CONGRUENCIALES LINEALES:

En 1951, D. H. Lehmer descubrió que residuos de potencias sucesivas de un número tienen buenas propiedades aleatorias:

Una expresión equivalente para calcular x después de calcular x
n

n-1

es:

Los parámetros a y m son llamados multiplicador y modulo respectivamente. Muchos de los generadores actuales son generalizaciones de la propuesta de Lehmer y tienen la siguiente forma:

(

)

En donde los x son enteros entre 0 y m-1, y las constantes a y b son no-negativas. La selección de a, b, y m afectan el periodo y la auto correlación en la secuencia. Entre los resultados de los estudios realizados con estos generadores tenemos:

1. El modulo m debe ser grande. Dado que los x están entre 0 y m-1, el periodo nunca puede ser mayor que m.
k

2. Para que el computo de mod m sea eficiente, m debe ser una potencia de 2, es decir, 2 . En este caso mod m puede ser obtenido truncando el resultado y tomando en k bits a la derecha.

25 entre x -18 n-1 y x . donde c. Por ejemplo.Ejemplo: 4 45 mod 16 = 45 mod 2 = 13 3. Son preferibles los generadores con menor autocorrelación entre números sucesivos. b) Todo número primo que sea un factor de m lo es también de a-1. k Todas estas condiciones se cumplen si m = 2 . Todos los generadores de periodo completo no son igualmente buenos. y k son enteros positivos.no tengan factores comunes excepto el 1. los dos generadores siguientes son de periodo completo. (( (( ) ) ) ) . c) es un múltiplo de 4 si m es un múltiplo de 4. mientras que el segundo n tiene una correlación despreciable de menos de 2 . a = 4c + 1. el periodo máximo posible m se obtiene si y solo si: a) Los enteros m y b son primos relativos -. y b es impar. b. Si un generador tiene el periodo máximo posible se llama generador de periodo completo. Si b es diferente de cero. pero el primero tiene una correlación de 0.

swing.toString()).getText()!=null) && (jtf_k. int m=0.toString()).*.event. /* * algoritmo. import javax.awt.toString()). if ((jtf_Xo.JOptionPane. } // <editor-fold defaultstate=”collapsed” desc=”Generated Code”> private void initComponents() {…} private void jb_calcularActionPerformed(java.getText(). esta hecho en java y utiliza la herramienta de NetBeans.getText()!=null)&&(jtf_c. String presentar=” ”.parseInt(jtf_Xo.java */ public class algoritmo extends javax. import javax.parseInt(jtf_g. int k=Integer. int x=0.getText(). double R[]=new double 100.getText()!=null)){ int Xo=Integer.getText().parseInt(jtf_k.swing.swing. .JFrame { public algoritmo() { initComponents(). utilizando el algoritmo congruencial lineal….Algoritmo congruencial lineal El siguiente código nos permite generar los números pseudo-aleatorios. int g=Integer.ActionEvent evt) { int a=0.getText()!=null) && (jtf_g. double X[]=new double 100.

setVisible(true). X0=Xo.invokeLater(new Runnable() { public void run() { new algoritmo(). g).println(m). //System. //System. } for (int i = 1.parseInt(jtf_c. } jta_presentar. a=1+4*k. } } public static void main(String args[]) { java. } else{ JOptionPane. “Es necesario que los valores de las variables estén completos y sean enteros”). } }).setText(presentar). Ri=Xi/(m-1).} . i++) { presentar+=Xi+”\t”+Ri+”\n”.println(a).awt. i <= m.out.getText(). for (int i= 1. m=(int) Math.out.pow(2.EventQueue.showMessageDialog(null.toString()).int c=Integer. i <= m. i++) { Xi=((a*Xi-1)+c)%(m).

000 .938 0. i 0 1 2 3 4 5 6 7 8 9 10 11 7 6 1 8 11 10 5 12 15 14 9 0 ) como semilla y obtenemos los números mostrados en el siguiente … 0.313 0.563 0.063 0. a=5 b=3 m = 16 ( Usamos esta ecuación con un cuadro.688 0. b y m para obtener números aleatorios entre 0 y 1.375 0.Ejemplo de Generadores Congruenciales Lineales Los generadores congruenciales lineales son de la forma: ( ) En este ejemplo usaremos los siguientes valores para a.625 0.750 0.875 0.500 0.

Supongamos también que el procesador es capaz de generar un número aleatorio por ciclo (esto es muy optimista ya que en realidad se requieren varios ciclos para producir un número aleatorio debido a las operaciones involucradas).2 Generadores Congruenciales Lineales Mixtos: Consideremos nuevamente el generador ( ).1. Esto son 10 ciclos o tics del reloj por segundo. no hay adición y el generador es llamado GCL multiplicativo y tienen la forma: Es obvio que estos son más eficientes que los mixtos. pero se observa que efectivamente esta secuencia es fácilmente agotable durante una simulación. Por lo tanto hay dos tipos de GCL multiplicativos dependiendo si m = 2 o no. . Bajo estas condiciones se agotaría la secuencia en . 9 Supongamos que tenemos una máquina con un procesador de 1GHz. Eficiencia adicional puede ser obtenida tomando m k k = 2 . Por supuestos que será en más tiempo. Si el incremento b es cero.1 Generadores congruenciales lineales multiplicativos: Los GCL presentados anteriormente son GCL mixtos. 1. En la medida que las computadoras se han vuelto más rápidas. la longitud de su ciclo se ha tornado inadecuada ya que se corre el riesgo de que. la secuencia se agote y se repita varias veces trayendo como consecuencia serias dudas en cuanto a la validez de los resultados. en unas cuantas horas de simulación.

Requiere un número entero detonador (llamado semilla) con D dígitos.. Ejemplo 1 Se desea generar una secuencia de números de 4 dígitos pseudo-aleatorios usando el método del medio del cuadrado. solo que ahora se elevan al cuadrado los D dígitos del centro que se seleccionaron para obtener el primer ri.. Para obtener el segundo r j. el primer numero ri. se determina simplemente anteponiendo el “0”. sea Xi+1= los D dígitos del centro. MÉTODO DE CUADRADOS MEDIOS Este algoritmo no congruencial o de cuadrados medios fue propuesto en la década de los 40 del siglo XX por Von Neumann y Metrópolis. se sigue el mismo procedimiento. agregue ceros a la izquierda del número. 9635. 8252. y sea ri=0.2.. el cual es elevado al cuadrado para seleccionar del resultado los D dígitos del centro.. Para ello..2. Repetir el paso 3 hasta obtener los n números rj deseados Si no es posible obtener los D dígitos del centro del número Y. Sea X0=resultado de elevar X0 al cuadrado. 5913. se elige como semilla el número x0 = 3187: (3187)2= 10156969 x1 = 1569 (1569)2= 02461761 x2 = 4617 (4617)2= 21316689 x3 = 3166 (3166)2= 10023556 x4 = 0235 (0235)2= 00055225 x5 = 0552 (0552)2= 00304704 x6 = 3047 (3047)2= 09284209 x7 = 2842 Siguiendo con este proceso se irían obteniendo los números 0769. Los pasos para generar números con el algoritmo de cuadrados medios son: 1. a esos dígitos. 4. 8332. al cuadrado. sea X1=los D dígitos del centro. D dígitos del centro para toda i=1. 3. 4222. Este método se repite hasta obtener n números ri. .. Sea Yj = al resultado de elevar X. Seleccionar una semilla (X0)con D dígitos (D>3) 2.3…n.

En este generador es imposible garantizar esto. partiendo de la semilla x0 = 44: (44)2= 1936 x1 = 93 (93)2= 8649 x2 = 64 (64)2= 4096 x3 = 09 (09)2= 0081 x4 = 08 (08)2= 0064 x5 = 06 (06)2= 0036 x6 = 03 (03)2= 0009 x7 = 00 (00)2= 0000 x8 = 00 . la mayoría de las veces éstos se podrán diseñar de forma que se garantice que el número cero no se van a producir.Las secuencias obtenidas mediante esta técnica presentan gran número de problemas como bajo periodo (es decir. todos los números siguientes de la secuencia serán el cero. el siguiente ejemplo muestra este caso. Si bien este último problema se puede presentar en la mayoría de los generadores de secuencias pseudoaleatorias. Ejemplo 2 Se desea generar una secuencia de números de dos dígitos pseudo-aleatorios empleando el método del medio del cuadrado. que suelen caer rápidamente en una rutina que se repite continuadamente) y el hecho de que si en algún momento se produce el número cero.

setText(null).INFORMATION_MESSAGE). JOptionPane. int diferenciaLargo=0. String cadenaCuadrado=" ". } else{ long inicial=0.getText().parseInt(semilla)<0 ){ JOptionPane."Error".parseInt(txtCuantos. int largoCuadrado=0. if (semilla.".. int posicionCentro=0.. "Se necesita una semilla mínima de 4 dígitos.Algoritmo De Cuadrados Medios try{ semilla=txtSemilla. String valor. . int cuantos=0.showMessageDialog(null.length()<4 || Integer.getText()).parseInt(semilla). do{ inicial=Integer. int largoSemilla=0. long cuadrado=0. txtNumeros. num=Integer.

println("\tLongitud del cuadrado : " + largoCuadrado). System. cadenaCuadrado=cero + cadenaCuadrado..println("Diferencia de las longitudes : " + diferenciaLargo). System.length().out. System.length()...length().out.out.println("Semiilla inicial : " + inicial).valueOf(cuadrado). diferenciaLargo=largoCuadrado-largoSemilla.. cadenaCuadrado=String.out.out.println("Agregando ceros. System.out..length().println("Longitud de la semilla : " + largoSemilla).out.."). //agregamos ceros o dejamos igual dependiendo de si es par la diferencia //entre las longitudes if (diferenciaLargo%2==0){ posicionCentro=(largoCuadrado-largoSemilla)/2.System.. System.... largoCuadrado=cadenaCuadrado. largoCuadrado=cadenaCuadrado... do{ System.out. System..println("Semilla al cuadrado : " + cuadrado).println("Longitud del cuadrado : " + largoCuadrado). diferenciaLargo=largoCuadrado-largoSemilla. cuadrado=inicial*inicial.println("\tLongitud de la semilla : " + largoSemilla).out. largoSemilla=semilla. .println("\tCadena actual : " + cadenaCuadrado). } else{ //Aqui es donde agregamos ceros char cero='0'.. System. largoSemilla=semilla.

semilla=String.out. } .out.valueOf(valor)..INFORMATION_MESSAGE).println("Número obtenido: " + valor)... } posicionCentro=(largoCuadrado-largoSemilla)/2...println("Diferencia de las longitudes" + diferenciaLargo).x" +cuantos + "="+ valor + ".. "Falta algun de los dato necesarios o los datos son incorrectos\n o se ha"+"producido un error desconocido por favor verifique... posicionCentro+largoSemilla).. } while(cuantos<num). System.System... } } catch(Exception ex){ JOptionPane...println("Posicion central : " + posicionCentro). JOptionPane... valor=cadenaCuadrado....out..r" + cuantos + "=" + "0. System.. cuantos++..." + valor + "\n")......getText() + "x"+ cuantos + "=" + semilla + "... System..out.substring(posicionCentro."Error".x"+ cuantos + "=" + cadenaCuadrado + ".......println("Cadena al cuadrado modificada : " + cadenaCuadrado)...showMessageDialog(null.. txtNumeros...setText(txtNumeros.. } while (diferenciaLargo%2!=0)...".

x ). Idealmente se esperan puntos en cada celda.. x ).PRUEBAS DE ALEATORIDAD 1. PRUEBA DE SERIES Esta prueba es usada para probar uniformidad en dos o más dimensiones. Se puede usar la chi-cuadrado para 2 encontrar la desviación entre lo observado y lo esperado. . (x . podemos construir n/2 pares no solapados (x . obtenemos: . y contar los puntos que caen en 1 2 3 4 cada celda. Ejemplo: 2 Para el generador ejemplo. y dividiendo en 5 = 25 celdas que dan 250 pares no solapados.. Los grados de libertad son K -1. se 2 divide el espacio entre 0 y 1 en K celdas de igual área. En dos dimensiones. Si tenemos una muestra de tamaño n. usando una muestra de tamaño 500. Es fácil ver como se puede extender la prueba a k-dimensiones..

0. PRUEBA PÓKER Esta es una prueba de independencia basada en la frecuencia con que ciertos dígitos se repiten en una serie de números. 2. Su nombre se debe al popular juego de cartas Póker.10. La dependencia entre números sucesivos aparece como no-uniformidad en dimensiones más grandes. El valor de es 23. 0.y las siguientes frecuencias: Con 250 pares esperamos 10 observaciones por celda.331.414. 0. No se deben usar pares solapados.577.010 En cada caso aparecen uno de los tres dígitos repetido y las posibilidades para este caso son: • Los tres dígitos distintos • Los tres dígitos iguales • Un par de dígitos iguales .909. Si graficamos los pares no solapados.033. si números sucesivos tienen correlación de primer orden negativa. 0. 0.255. es muy probable un valor alto x sea n seguido de un valor bajo x n+1 .828. Por ejemplo.2. por lo tanto aceptamos que los números son uniformes en dos dimensiones a un nivel de α=0. Si se usan pares solapados. 0.2 y la [ ] 33. los puntos tienden a concentrarse derecha-y-abajo e izquierda-y-arriba y no se pasará la prueba. el número de puntos por celda no es independiente y no se puede usar la prueba chi-cuadrado. 0. Consideremos la siguiente serie de números con una repetición inusual de dígitos: 0.

para 5 dígitos.9) (0. 0. todos distintos. 0. = 5.1) = 0.750. podríamos tener. etc.563 Ahora las probabilidades esperadas son: P (todos distintos) = P (segundo distinto del primero) P (tercero distinto del segundo) = (0.500. Aplicación de Prueba de Póker Para realizar esta prueba tomaremos 10 datos y sus 3 primeros dígitos.688. un trio y un par.063. 0.66 > números. todos iguales. 0.99 y por lo tanto rechazamos la hipótesis de independencia de los Esta prueba se puede extender a más dígitos pero a su vez las posibilidades aumentan y los cálculos se complican.938.875.y las probabilidades asociadas son: P(todos distintos) = P(segundo distinto del primero)P(tercero distinto del segundo) P(todos iguales) = P(segundo igual al primero)P(tercero igual al segundo) P (un par) = 1 – P(todos distintos) – P(todos iguales) Supongamos una secuencia de 1000 números aleatorios en donde se analizan los tres primeros dígitos y se tiene que 680 tienen los 3 dígitos distintos. Por ejemplo.1) (0.625. exactamente un trio.8) = 0. Los cálculos respectivos usando la prueba Chi-Cuadrado son: Observamos que 47.27 .72 P (todos iguales) = P (segundo igual al primero) P (tercero igual al segundo) = (0.313. 0. 289 contienen exactamente un par y 31 tienen todos iguales. 0. 0. exactamente un par. por lo tanto tenemos: 0. 0. 0. dos pares.01 P (un par) = 1 – 0.72 – 0.01 = 0.375.

.37 Todos iguales Todos distintos Exactamente un par 8 0 2 10 Observamos que números. 92. mientras que 03. se tiene que: 30. 57.Caso Frecuencias Observadas ( Frecuencias Esperadas ( ) ) ( ) 7. y por lo tanto aceptamos la hipótesis de independencia de los 3. 92. 57. mientras que 03. Por ejemplo: 03. 27 contiene (03. el número de corridas que es una variable aleatoria distribuida normalmente con media y varianza conocida. 99. 57 . La prueba se realiza de la siguiente manera: Paso 1. 99.1 2.… Esta prueba se basa en el supuesto que el número de corridas es una variable aleatoria.. 23. 23. 99. (223.Se selecciona una muestra de tamaño n (n>20) . 92. (57) Si se utiliza el signo + para identificar que el número que aparece a la derecha de otro es mayor.10 0. PRUEBA DE LA CORRIDA Una corrida se define como un conjunto de números que aparecen ordenados en forma monotonicamente creciente o decreciente. 23. 92.09 0.Se formula la hipótesis Ho: La secuencia de números es aleatoria. Paso 2.18 0. o si es menor. 23. 99 contienen una sola corrida.99).92).2 0.7 10 0. Si una secuencia tiene más de 20 números.

Se acepta ho. a fin de conocer cuál distribución se adecua mejor al modelo. Mediante la prueba se compara la distribución acumulada de las frecuencias teóricas (ft) con la distribución acumulada de las frecuencias observadas (f obs). en las cuales se supone que tienen una distribución normal. de Poisson. binomial.. Arreglar estos valores teóricos en frecuencias acumuladas. si donde z(*) esta tabulada en la distribución normal. etc. Ejemplo: Se tiene la siguiente secuencia de números pseudoaleatorios: 10 37 08 99 12 66 31 85 63 73 32 04 68 02 99 74 10 77 32 42 76 64 19 09 80 34 45 02 05 03 13 74 09 70 36 76 82 64 74 64 34 24 23 28 64 36 35 68 90 35 si r = 35 De tablas: Z(0. es decir. permite medir el grado de concordancia existente entre la distribución de un conjunto de datos y una distribución teórica específica. . a un nivel de riesgo . Para el caso.7517 Por lo que para el nivel de significancia por ejemplo 10% Se afirma la Hipótesis Ho: La secuencia de números es aleatoria. 4..Se definen con los signos +.Paso 3. Paso 5.Se define la estadística r como el numero de corridas. las frecuencias de las distribuciones teóricas deben contrastar con las frecuencias observadas.. 2. Paso 4.si n>20 y Ho es verdadera.68) = 0. Calcular las frecuencias esperadas de la distribución teórica específica por considerar para determinado número de clases.las posibles corridas. en un arreglo de rangos de menor a mayor. entonces r se aproxima a una distribución normal con media: Paso 6.. PRUEBA DE KOLMOGOROW La prueba de Kolmogorov-Smirnov para una muestra se considera un procedimiento de "bondad de ajuste". Pasos: 1. Su objetivo es señalar si los datos provienen de una población que tiene la distribución teórica especificada. se encuentra el punto de divergencia máxima y se determina qué probabilidad existe de que una diferencia de esa magnitud se deba al azar. . En las tareas de investigación se pudo obtener un conjunto de observaciones.

Las diferencias entre los valores observados y los teóricos de la distribución normal se deben al azar. se acepta Ho y se rechaza Ha. Aplicar la ecuación D = ft . Comparar el valor estadístico D de Kolmogorov-Smirnov en la tabla de valores críticos de D. El modelo experimental tiene una muestra y es factible un arreglo en el carácter ordinal o en los rangos de las series de clases.   Hipótesis alterna (Ha). Nivel de significación. Zona de rechazo. se acepta Ha y se rechaza Ho. Para todo valor de probabilidad igual o menor que 0.3. Hipótesis nula (Ho). Los valores observados de las frecuencias para cada clase son diferentes de las frecuencias teóricas de una distribución normal. 4. . Planteamiento de la hipótesis. donde D es la máxima discrepancia de ambas.05. 5. EJEMPLO: En una investigación.fobs En esta ecuación se aprecia que el procedimiento es muy simple y quizá lo que parezca más complicado corresponde al cálculo de la frecuencia esperada de cada tipo de distribución teórica. Arreglar acumulativamente las frecuencias observadas.2 ± 2. Por lo tanto. 6. Ecuación: D = ft . Tabla de 100 niños. Para todo valor de probabilidad mayor que 0.85. en la marcha de los ejercicios se presentará cada uno de ellos y la manera de aplicar la prueba estadística.05. consistente en medir la talla de 100 niños de 5 años de edad. Elección de la prueba estadística. Los valores X +  son 99.f obs. se desea saber si las observaciones provienen de una población normal. Decidir si se acepta o rechaza la hipótesis.

Estos resultados de diferencias se multiplican por el tamaño de la muestra (100 niños). Para cada valor Z.4997 . se obtiene la diferencia entre los límites de clases entre el superior y el inferior.2794 . 105 y 109). Inicialmente se determina el valor Z de los límites de cada clase en la serie. se localiza el área de la curva tipificada de la tabla de números aleatorios.206 y -0. Cálculos de los valores teóricos.(-0.5151. y en las subsecuentes sólo los límites superiores (97. se localiza el área bajo la curva norma tipificada.0.4854 .014. Para cada valor de Z. por ejemplo: en la primera clase se determinan el límite inferior y el superior (90 y 93).020.(-0. como se muestra en la siguiente tabla. Los cálculos de valores Z.4854) = 0. .4994) = 0. Primero se elaboran los cálculos de los valores teóricos esperados para la distribución normal.Aplicación de la prueba estadística. 101. Cálculo estadístico D de Kolmogorov-Smirnov. 0. Las frecuencias acumuladas teóricas y las observadas se arreglan en los rangos correspondientes. (Véase: tabla de áreas bajo la curva normal tipificada de 0 a 2). luego se obtienen las frecuencias teóricas y después se arreglan en frecuencias acumuladas. por ejemplo: 0. -0.(-0.4793 .2436. son de la forma siguiente: Y así sucesivamente.2794) = 0.4793 = 0.2357 . 0. y posteriormente se aplica la fórmula de KolmogorovSmirnov.0.2357 = 0. A partir de estos valores.

. se acepta Ho y se rechaza Ha.0. y todo valor mayor que D al calculado tinen una probabilidad menor que 0. el estadístico de Kolmogorov-Smirnov obtendo es menor que el crítico y su probabilidad mayor que 0.049.05. las observaciones tienen una distribución normal. En virtud de lo anterior. Interpretación. valor que se compara con los valores críticos de D en la prueba muestral de Kolmogorov-Smirnov y se obtiene la probabilidad de la existencia de esa magnitud de acuerdo con la prueba de Kolmogorov-Smirnov. por lo tanto.05.036 La diferencia máxima D es igual a -0. El valor N es 100 y el mayor número de N en la tabla es 35.D = ft . la probabilidad correspondiente es mayor que 0. es inversamente proporcional al crítico determinado o localizado en la tabla. o sea. Por lo tanto. Decisión.fobs = .05. por lo cual se aplica la fórmula al pie de la tabla: Para la probabilidad de Lo anterior quiere decir que para todo valor menor que el crítico para una probabilidad de 0.05. Las frecuencias observadas y las teóricas calculadas no difieren significativamente.