Академический Документы
Профессиональный Документы
Культура Документы
Resumen
Lo que se quiere conseguir con esta practica es implementar los diferentes metodos para
generar números aleatorios tanto los clasicos como el congruencial y actuales como el xorshift y
el retraso de Fibonacci utilizando el lenguaje de programación Python y comparando algunos
con sus librerias.
Pälabras clave : Aleatoriedad, Distribución, xn = (axn−1 + k)modM (1) pero estos meto-
Periodicidad, Uniformidad dos hoy en dia son facilmente predecı́bles usan-
do algebra de matrices y un poco de matemática
discreta como se ilustra mas adelante, por este
1. Objetivos motivo se han ideado nuevas maneras para ge-
nerar números aleatorios que no son tan faciles
1.1. General de predecir en este documento se mostrarán al-
1) Leer y analizar el material de Bb. sobre gunos.
números aleatorios e implementarlos experimen-
talmente en el lenguaje de programación Python. 3. Marco Teórico
1.2. Especificos Para lograr un buen diseño de alguna apli-
cación que tenga que ver con procesos aleatorios
1) Leer y entender el material teórico sobre es necesario simular datos al azar, necesitamos
números aleatorios. que un computador genere una secuencia aleato-
2) Implementar en python metodos clasicos y ac- ria, pero este no puede generar por si solo una
tuales para la generación de números aleatorios. secuencia de esta manera, por ello se empieza a
3) Realizar almenos pruebas minimas para ga- generar metodos para simular que son aleatorios
rantizar unos buenos diseños de los generadores. (en realidad pseudoaleatorios)
4) Implementar un codigo para Crakear los núme-
ros generados por un RNG Congruencial de re-
currencia común para predecir la secuencia. 3.1. RNG CONGRUENCIAL
Por sus siglas en ingles Random − number −
Generator es un generador que se basa en me-
2. Introducción todos congruentes, genera secuencias de la for-
2 3 2
Existen metodos clasicos para generar núme- ma f (x), f (x), f (x), ..... donde f (x) es f (f (x)
ros aleatorios usando diferentes recurrencias, el y asi..., su recurrencia mas básica es : xn =
congruential RNG más comun usa la recurrencia (axn−1 + k)modM eventualmente por introducir
la operación modulo se repetirá despues de cierto
ciclo para garantizar un periodo largo (Maximo
1
M) se debe escoger con cuidado los valores de unas tablas con buenos candidatos para escoger
a, k, M que son números enteros positivos, acon- y diseñar generadores Lagged-Fibonacci y XorS-
tinuación unos criterios para escogerlos: hif.
M = número primo mas grande que no se pase
de por ejemplo 232 , 264
a = número primo no mas grande que M 4. Analisis y Diseño
K = cualquier número impar
En esta sección se hara un breve analisis (im-
Habiendo escogido con cuidado estos parametros
portante) de los generadores y se diseñara los
solo se necesita una semilla (x0 ) aleatoria para
tres tipos de RNGs ya estudiados. Todo el codi-
empezar la secuencia, si la semilla es aleatoria y
go esta en el archivo randomLAB.py y aparte un
con distribución uniforme entonces la secuencia
archivo crakingCongruential.py que se explicará
tendrá distribución uniforme como indica el au-
mas adelante, en el primer archivo al ejecutarse
tor : ’If f is one-one function over Z then for any
el programa este empieza con la función menu.
random seed x0 chosen uniformly of Z the ran-
dom variable f (x) is also uniformly distributed
DEF MENU : Este desprende las opciones para
over Z’ [1][2].
escoger este esta dentro de un ciclo While pa-
ra que no termine hasta que la variable auxiliar
3.2. XORSHIFT tenga estado logico False (ocurre solo cuando se
Este tipo de generador se basa en una secuen- presiona la letra ’g’), acontinuación el objetivo de
cia de la siguiente manera βT, βT 2 , βT 2 , βT 3 , ... esta función es capturar un dato y almacenarlo
donde β es la semilla pero esta vez no es un en- en una variable posteriormente llamar una fun-
tero, es un vector binario de tamaño 1xn que ción semilla, una función captura e invoca una
debe cumplir las mismas condiciones que la se- clase y se repite hasta que la variable auxiliar se
milla de RNG Congruential, y T se puede ex- False.
presar como una matriz binaria nxn no singu-
lar que nos generará en la semilla varios cam- DEF SEMILLA : Usando la librerı́a datetime de
bios de posición en binario, normalmente es : python y su metodo .now().microsecond captu-
T = (I + La )(I + Rb )(I + Lc ), aquı́ I es la matriz ramos el tiempo en microsegundos y la almacene
identidad, L es la matriz que genera un cam- en ’dt’ despues pasa por unas operaciones básicas
bio a la izquierda de una posición, el exponen- para que retorne un valor aleatorio entre 0 y 999.
te indica que el cambio no es de 1 sino de a y
R es la transpuesta de L que genera un cam- DEF CAPTURA : Esta función se encarga de
bio a la derecha de uno, pero la secuencia tam- pedir un dato por teclado y asegurarse que sea
bien la podemos expresar de la siguiente manera un número entero con el comando ’int’ y en caso
: (I + La )∗ = y << a donde el operador ∗ indica de error este quede atrapado en la excepción.
la operación Xor en binario y << a indica un
desplazamiento de a cambios a la izquierda de Despues se tienen las clases para cada opción :
esta manera podemos aplicar la secuencia más
facilmente.[1][2][4] 4.1. RNG Congruencial (DISEÑO
PROPIO)
3.3. LAGGED-FIBONACCI Como se estudio en el marco teorico se usará
O retraso de Fibonacci, su recurrencia básica la recurrencia para el generador congruentcial
es : xn = xn−r ?xn−s con r > s y el operador ? usando la ecuación 1, esta clase recibe como pa-
indica cualquier operación artimetica o lógica co- rametros la variable ’N’ que es la cantidad de
mo +,-,*,Xor dependiendo de cual se escoga se números aleatorios y tambien recibe la semilla.
tendra un mejor o peor periodo. Su implemen- Teniendo en cuenta los parametros para escoger
tación es sencilla y tiene muy buenos resultados a, k, M se han seleccionado por conveniencia m
en los test de aleatoriedad desde que se escogan = 503 (Número primo), a = 499 (Número pri-
bien los parametros para r y s en [3] se muestran mo mas grande menos a M ), k = 13, con esta
2
secuencia aseguro un periodo de maximo M =
503, esto se demuestra facilmente generando los
números como se muestra en la figura 1.
3
^= np.left shift(sem,abs(g)) para correr en bina- 5. CRAKING RNG CON-
rio a ’sem’, ’g’ veces a la izquierda y el operador
^ para hacer la operación Xor.
GRUENTIAL (ALGO EX-
TRA)
4.5. RNG-XORSHIFT
5.1. Analisis
(COMPARACIÖN ENTRE C
Y D) Los RGN congruenciales se han vuelto muy
faciles de crakear debido a que son clasicos, un
Esta clase lo que hace es una comparación Craking RNG consiste en un sistema que sea ca-
entre los RNG tanto el de diseño propio como el paz de encontrar las constantes de la recurrencia
de usando la librerı́a de numpy para mirar que común, el modulo M, el incremento K y el mul-
tan buen codigo es el primero con respecto al tiplicador a. En el documento ’Random Number
otro ya que llama las dos clases y les pasa la Generators’ el autor propone un metodo que ha
misma semilla un ejemplo de esto se visualiza en usado por mas de treinta años que solo nesecita
la figura 4. seguir los siguientes pasos : [1]
1) Tener una secuencia de numeros (A) produ-
cidos por un RGN Congruencial de recurrencia
común.
2) Hacer grupos de dos (A[0],A[1]),(A[1],A[2])
,(A[1],A[2]),......
3) Cada tres grupos encontrar la determinan-
te para obtener la secuencia de determinantes
Figura 4: Comparación entre los generadores (δ0, δ1, δ2, δ3, .....)
Xorshift de numpy y de diseño propio 4) Generar una secuencia con el maximo comun
divisor de los primeros dos determinante, luego
de los primeros tres, luego de los primerso cua-
tro, ....., despues de hacer esto unas seis veces
4.6. LAGGED-FIBONACCI notamos que el numero empieza a repetirse de
ahi en adelante, ese número es el modulo M.
Retrasp de Fobonacci, como estedio en la teo- 5)Con los tres primeros valores de la secuencia
ria su recurrencia mas comun es : xn = xn−r ∗ de entrada se arma el sistema de ecuacione con-
xn−s para r > s se escogio la operación multi- gruente que debe ser solucinado para encontrar
plicación ∗ ya que esta en comparación con la a y k.
operación Xor y +,- tiene un periodo muacho A[0] ∗ a + k = A[1]modM
mas largos (para más sobre periodicidad visite
: [1],[2][3],[4]), para generar secuencia menores a A[1] ∗ a + k = A[2]modM
20 números r y s son : 5 y 1 respectivamente y pa- Ejemplo1 : Se tiene la secuencia producida
ra mayores a 20 son : 17 y 5 respectivamente por por un RNG Congruencial [768 54 747 221 321
cosas de conveniencia y por que estos números 48 225 669 414 163 260 723 127 119 420 685 809
son aconsejables en tablas ya que generan bue- 630]. Determinar el modulo, el incremento y el
nos resultados. Una particularidad de esta clase multiplicador, comprobarlo.
es que esta es la unica que no recibe mas que la Solución : Siguiendo los pasos del item anterior
cantidad de números que se desean generar y este : 2) Generando parejas
genera sus propias semillas usando la librerı́a da-
tetime y time para esperar unos microsegundos, [768, 54][54, 747][747, 221][221, 321][321, 48]...
inmediatamente despues de generar cada semilla
se llama el metodo ’Secuencia’ que genera los re-
trasos y al final hace modulo 103 para no genere
números mas grandes a este y como es núme-
ro primo grande genera una buena distribución
uniforme.
4
3) Generando los determinantes La solución es de la forma :
n
|768 54| x = x0 + ∗k
d
|54 747|
|747 221|
∀ k = 0, 1, 2, ..., d − 1
δ1 = [768 ∗ 747 + 54 ∗ 221 + 747 ∗ 54]
x0 es la primera solución o solución unica de la
forma :
768 ∗ a + k = 54 mod 997 (1) Esto se demuestra facilmente ingresando los núme-
ros de la secuencia y al solucionar la ecuación con
54 ∗ a + k = 747 mod 997 (2) estos valores debe dar el siguiente número. Este
ejercicio es propuesto para que lo solucionen los
Ahora a (2) le restamos (1)
lectores en el documento ’Random Number Ge-
−714 ∗ a = 693 mod 997 (3) nerators, George Marsagli’, como inspiración al
documento se soluciona el ejercicio como ejem-
Es importante aclarar que esta es una ecuación plo en este articulo y se deja una secuencia como
en congruencias, lo que quiere decir que tendra ejecicio para los lectores :
solución si db es un número entero : Ejecicio : Se tiene la secuencia : [98, 258, 658,
661, 170, 438, 111, 789, 490, 241, 117, 804, 29,
i ∗ x = b mod n 584, 476, 206, 528, 336, 853, 650, 641, 120, 313,
297, 257, 157, 904, 279, 212, 543, 872, 199, 12,
Donde b = 693 y d = mcd(714, 997), de ser asi 43, 619, 65, 674, 701, 270, 688] Determinar el
la ecuación tiene d soluciones. multiplicador, el incremento y el modulo.
5
5.2. Diseño 6.1.1. Prueba de Medias
El codigo al ejecutarse empieza guardando en Una de las propiedades que debe cumplir las
la variable ’dato’ la lista que le regresa la funcion secuencias es que el valor esperado sea 0.5, Esta
capura la cual es lal encargada de pedir 10 mu- prueba consiste en tres sencillos pasos :
setras de los números .aleatorios”. se invoca la 1) Encontrar la media E(x) o valor esperado de
clase Craking y se pasa como parametro la lis- la secuencia con la ecuacion 1.
ta de muestras. CLASS CRAKING: Se inicializa PN
i=1 xi
el metodo init el cual llama el metodo determi- E(x) =
nantes que crea una lista vacia ’y’ se recorre la N
lista con un ciclo for y en la variable ’s’ se guar- (1) 2) Encontrar los limites superior e inferior
da la primera parte de la determinante, en ’f’ Limite inferior para la media (lim) :
se guarda la segunda parte de la determinante,
en ’t’ se restan las dos partes y se almacena el F/2
lim = E(x) − √ (2)
valor absoluto (ya que solo las necesitamos para 12 ∗ N
encontrar el mcd) en ’y’. Despues se guarda en Limite superior para la media (lsm) :
la variable ’self.m’ el valor que retorna la fun-
ción ’modulo’ al cual se le pasa la lista como F/2
lsm = E(x) + √ (3)
parametro y esta se encarga de llamar al metodo 12 ∗ N
’mcd’ el cual encuentra el mcd de dos números y 3) Mirar si la media esta en este rango, de ser asi
el metodo ’modulo’ con un for agrega a la lista esto nos garantiza que la media = 0.5
’y’ el mcd, de los primeros dos, de los primeros
tres, los primeros cuatro, .... haciendo mcd(a,b,c)
= mcd(mcd(a,b),c) finalmente retorna el ultimo 6.2. Prueba de Varianza
valor de la lista para asegurar que si sea el modu- Otra propiedad que debe cumplir la secuencia
lo. Ya teniendo el valor de M (modulo) se llama es que tenga varianza = 1/12 esto consiste en tres
el metodo ’sistema’ el cual se encarga de solu- sencillos pasos :
cionar el sistema de ecuaciones como se explica 1) Encontrar la varianza V(x) de la secuencia con
en el ejemplo 1. restamos de la ecuacion (1) a la ecuacion 4.
(2) mod m y se guardan en las variables ’p’ y PN
’h’ se encuentra el mcd de ’p’ y ’m’ y se com- i=1 x2i − 2 ∗ xi ∗ E(x) + E(x)2
E(x) = (4)
prueba que el sistema tenga solución con un if N −1
h %D==0, de no ser asi apararece un mensaje
2) Encontrar los limites superior e inferior
que dice ’El sistema no tiene solución’, aconti-
Limite inferior para la varianza (liv) :
nuación se incluye un ciclo while para buscar un
numero ’b’ que cumpla la condición de que al ser 2
X/2,n−1
multiplicado por ’p’ y modulo ’m’ de como re- liv =
12 ∗ (N − 1)
sultado ’h’ en ese caso el ciclo termina y procede
a hacer lo mismo con elvalor de ’k’ finalmente Limite superior para la varianza (lsv) :
retorna los valores de ’u’,’k’ que son ’a’ y ’k’ res- 2
X1−/2,n−1
pectivamente. Al final el programa muestra estos lsv =
tres valores. 12 ∗ (N − 1)
3) Mirar si la varianza esta en este rango, de
ser asi esto nos garantiza que la varianza de la
6. Pruebas de Aleatoriedad secuencia es : 1/12.
(ALGO EXTRA)
6.3. Prueba de chi-cuadrado
6.1. Analisis
La prueba chi-cuadrada busca determinar si
Existen varias pruebas para comprobar que la secuencia se distribuye uniformemente en el in-
tanbuenos son los generadores de numeros alea- tervalo [0,1] para llevar esta prueba acabo es ne-
torios nos centraremos en explicar 3. cesario dividir el intervalo (0,1) en subintervalos
6
√
en donde es recomendable M = N . posterior- la media, la varianza y los dos limites para cada
mente se clasifica cada numero pseudo-aleatorio uno.
del conjunto en m intervalos. A la cantidad de
números que se clasifican en cada intervalo se le
denimina frecuencia observada (Oi ) y a la canti- 7. Conclusiones
dad de números que se espera encontrar en ca-
1)Se logró leer y entender los documentos pro-
da intervalo se le llama frecuencia esperada (Ei )
puestos por el ingeniero subidos en la plataforma
teóricamente, la secuencia es igual a n/m. A par-
de Bb. para el analisis y entendimiento del mis-
tir de los valores de las frecuencia se determina
mo sobre la generación de números aleatorios y
el estadistico mediante la ecuación :
sus recurrencias.
m
Ei − Oi
X02 =
X
7
155 503 388 266 271 409 20 109 500 234 869 800 36 5 69 6 77 4
589 988 64 870 Resultado al pasarlo por el programa de pruebas
Resultado al pasarlo por el programa de pruebas :
: Media : 46.775 Limite inferior : 46.6855 Limite
Media : 511.725 Limite inferior : 511.6355 Limite superior : 46.8644 Prueba de medias : La me-
superior : 511.8144 Prueba de medias : La me- dia se encuentra entre los limites asi que pasa la
dia se encuentra entre los limites asi que pasa la prueba de medias
prueba de medias Varianza : 0.0760 Limite inferior : 0.05054 Li-
Varianza : 0.0660 Limite inferior : 0.05054 Li- mite superior : 0.12418 Prueba de varianza : La
mite superior : 0.12418 Prueba de varianza : La varianza se encuentra dentro los limites asi que
varianza se encuentra dentro los limites asi que pasa la prueba de varianza
pasa la prueba de varianza Finalmente se logro demostrar que los diseños
quedaron bien ya que pasaron estas dos pruebas
RNG-XORSHITT (DISEÑO PROPIO): Se- minimas para aleatoriedad.
cuencia producida por el generador : 4)La sección donde se describio el Craking RNG
923 99 75 959 396 959 75 99 923 0 577 587 742 se realizó un ejemplo analiticamente donde se en-
874 132 641 635 874 331 266 136 897 377 358 320 contraron las constantes de modulo, incremento
244 92 809 201 6 637 878 339 282 168 961 505 y multiplicador (m,k,a respectivamente) y el re-
614 832 247 sultado al pasar la secuencia 768 54 747 221 321
Resultado al pasarlo por el programa de pruebas 48 225 669 414 163 260 723 127 119 420 685
: 809 630 fue a = 87, k = 37, m = 997 usando
Media : 476.75 Limite inferior : 476.6605 Limite el programa CrakingCongruential.py se obtuvo
superior : 476.8394 Prueba de medias : La me- los siguientes resultados de la figura 5: En el
dia se encuentra entre los limites asi que pasa la
prueba de medias
Varianza : 0.10214 Limite inferior : 0.05054 Li-
mite superior : 0.12418 Prueba de varianza : La
varianza se encuentra dentro los limites asi que
pasa la prueba de varianza
8
Figura 6: Resultado experimental del Craking
8. Bibliografı́a
[1] Marsaglia, George (2003) Random Num-
ber Generators,”Journal of Modern Applied Sta-
tistical Methods: Vol. 2 : Iss. 1 , Article 2. Avai-
lable at: http://digitalcommons.wayne.edu/
[2] Matrices and the Structure of Random Num-
ber Sequences George Marsaglia and Liang-Huei
Tsay Computer Science Department Washing-
ton State University
[3] TABLES OF LINEAR CONGRUENTIAL GE-
NERATORS OF DIFFERENT SIZES AND GOOD
LATTICE STRUCTURE - PIERRE L’ECUYER
MATHEMATICS OF COMPUTATION Volu-
me 68, Number 225, January 1999, Pages 249–260
[4] Xorshift RNGs George Marsaglia The Florida
State University
[5] LOS NÚMEROS ALEATORIOS Y LA IN-
GENIERIA LUIS GERARDO ASTAIZA A. In-
genlero Mecanlco, M.I.S. Profesor Asoclado Unl-
versldad NaCIONAL [6] UNIFORMIDAD DE
LOS NÚMEROS ALEARTORIOS