18
INSTITUTO TECNOLÓGICO DE ACAPULCO INGENIERIA EN SISTEMAS COMPUTACIONALES Profesor: Dr. De La Cruz Gámez Eduardo “Generación de números aleatorios” Alumno: Rodríguez Martínez Juan Manuel 09320873 26 de Septiembre de 2013 Modelado Virtual

numeros aleatorios

Embed Size (px)

Citation preview

Page 1: numeros aleatorios

INSTITUTO TECNOLÓGICODE ACAPULCO

INGENIERIA EN SISTEMAS COMPUTACIONALES

Profesor: Dr. De La Cruz Gámez Eduardo

“Generación de números aleatorios”

Alumno:

Rodríguez Martínez Juan Manuel 09320873

26 de Septiembre de 2013

Modelado Virtual

Page 2: numeros aleatorios

Introducción

Un número aleatorio es aquel obtenido al azar, es decir, que todo número tenga la misma probabilidad de ser elegido y que la elección de uno no dependa de la elección del otro. El ejemplo clásico más utilizado para generarlos es el lanzamiento repetitivo de una moneda o dado ideal no trucado.

En general cuando se requiere una impredecibilidad en unos determinados datos, se utilizan números aleatorios

Los seres humanos vivimos en un medio aleatorio y nuestro comportamiento lo es también. Si deseamos predecir el comportamiento de un material, de un fenómeno climatológico o de un grupo humano podemos inferir a partir de datos estadísticos. Para lograr una mejor aproximación a la realidad nuestra herramienta predictiva debe funcionar de manera similar: aleatoriamente. De esa necesidad surgieron los modelos de simulación.

En la vida cotidiana se utilizan números aleatorios en situaciones tan dispares como pueden ser los juegos de azar, en el diseño de la caída de los copos de nieve, en una animación por ordenador, en test para localización de errores en chips, en la transmisión de datos desde un satélite o en las finanzas.

Como se pueden generar los números aleatorios.

La lógica nos hace pensar que las personas somos generadores aleatorios imperfectos, hay estudios que demuestran que existen tendencias claras en los humanos para la elaboración de secuencias sesgadas y están relacionadas con características personales, con los conocimientos o informaciones previas o con la edad.

Métodos manuales, lanzamiento de monedas, lanzamientos de dados, dispositivos mecánicos, dispositivos electrónicos

Métodos de computación analógica, son métodos que dependen de ciertos procesos físicos aleatorios, por ejemplo, el comportamiento de una corriente eléctrica.

Métodos de computación digital, cuando se usa el ordenador digital.

Page 3: numeros aleatorios

Tablas de bibliotecas, son números aleatorios que se han publicado; de los cuales podemos encontrar listas en los libros de probabilidad y tablas de matemáticas. Estos números fueron generados por alguno de los métodos de computación analógica

Que son los números pseudoaleatorios

Son unos números generados por medio de una función (determinista, no aleatoria) y que aparentan ser aleatorios. Estos números pseudoaleatorios se generan a partir de un valor inicial aplicando iterativamente la función. La sucesión de números pseudoaleatorios es sometida a diversos test para medir hasta qué punto se asemeja a una sucesión aleatoria

Números aleatorios vs pseudoaleatorios

Las sucesiones de números pseudoaleatorios son más rápidas de generar que las de números aleatorios. Si las personas tenemos dificultad en generar números aleatorios, mucho más la tiene un ordenador, la dificultad está en que un ordenador es tan "torpe" que no sabe generarlos. Por eso usan números pseudoaleatorios, que para nuestro fin es lo mismo, pues nadie los puede predecir.

Aplicaciones de los números aleatorios

En el corazón de todos los sistemas criptográficos, está la generación de números secretos que no puedan ser adivinados por otra persona, es decir aleatorios.

Es claro que la seguridad de la información es importante para el comercio electrónico. Los servicios de seguridad están basados en mecanismos de criptografía, los cuales hacen uso de números aleatorios. Estos son utilizados para:

Mecanismos de autenticación (usando una clave generada como numero aleatorio) para proteger el mensaje.

Mecanismos de confidencialidad utilizan llaves secretas o llaves de sesión para proteger datos durante un intercambio de información.

Page 4: numeros aleatorios

Mecanismos de firma digital requieren llaves privadas, los cuales son generados de números aleatorios.

Métodos para generar números aleatorios

Algunos métodos para la generación de números aleatorios son:

1) El método de los cuadrados del medio, debido a Von Newmann y Ulam.2) Métodos congruenciales, desarrollados por Lehmer

I) Mixto.II) Multiplicativo

Método de los cuadrados del medio

Este método consiste en generar aleatoriamente un número de cuatro dígitos, denominado la semilla, elevarlo al cuadrado y establecer una forma de tomar los cuatro números centrales del resultado de la exponenciación, ya sea quitando dos o un sólo dígito de cada extremo del resultado.

EJEMPLO 1. Sea la semilla RND0 = 4380, (obtenida aleatoriamente con el pro-cedimiento de “papelitos” o tarjetas numeradas del 0 al 9 cada una).

(4380)2 = 19184400, por lo que al eliminar las cifras exteriores 19 y 00; tenemos que:

RND1 = 1844. Aplicamos iterativamente este procedimiento y tendremos:(1844)2= 3400336. Como esta es una cifra con un número impar de dígitos, establecemos el criterio de aumentar por la izquierda un cero (puede ser a la derecha), es decir, ahora tendremos: 03 40 03 36. Entonces, al eliminar a la izquierda la cifra 03 y a la derecha la cifra 36, tendremos:

RND2 = 4003; (4003)2=16 02 40 09, eliminando a la izquierda la cifra 16 y a la derecha la cifra 09, tenemos:

RND3 =0240; (240)2=57600, entonces: 05 76 00. Aquí se elimina un solo dígito tanto a la izquierda como a la derecha, por lo que:

Page 5: numeros aleatorios

RND4 =5760; (5760)2 =33 17 76 00

RND5 =1776; y así sucesivamente hasta obtener el tamaño de muestra deseado, o bien hasta que el procedimiento se degenere repitiendo una serie de números previamente generados. Si eventualmente se obtiene la semilla inicial, a la cantidad de números obtenida se le llama período del generador.

Métodos congruenciales

Los métodos congruenciales están basados en el álgebra de congruencias.

I) El Método congruencial mixto

El método mixto tiene la siguiente ecuación de recurrencia:

Donde

a = es la constante multiplicativa.c = es la constante aditiva.m = es la magnitud del módulo.X0 = es la semilla.

Los requisitos mínimos que estos parámetros deben satisfacer son:X0, a, c, m >= 0; enteros y m > a, m > c, m > X0

Aquí mod representa a la operación aritmética módulo entre los enteros a y b tal que el resultado de (a mod b) es el residuo entero de la división a entre b.

Page 6: numeros aleatorios

EJEMPLO 2. Sea el generador congruencial mixto

Xn+1 = (5Xn + 7) mod 8

con X0 =4 (la semilla)X1 = (5*4+7) mod 8 8 27 X1= 3; RND1 = 0.375

X2 = (5*3+7) mod 8 8 22 X2 = 6; RND2 = 0.750

X3 = (5*6+7) mod 8 8 37 X3 = 5; RND3=0.625

X4 = (5*5+7) mod 8 8 32 X4= 0; RND4=0.000

X5 = (5*0+7) mod 8 8 7 X5= 7; RND5=0.875

X6 = (5*7+7) mod 8 8 42 X6= 2; RND6=0.250

X7 = (5*2+7) mod 8 8 17 X7= 1; RND7=0.125

X8 = (5*1+7) mod 8 8 12 X8= 4; RND8=0.500

El valor de X8 = 4, es igual al de la semilla X0, por lo que la sucesión obtenida se repetirá.En la siguiente tabla se muestran los resultados, obsérvese que Xi es el resultado de la operación módulo, mientras que RNDi es el correspondiente valor en decimales.

Generador Xn+1=(5Xn+7) mod 8

n Xn (5Xn+7)/8 Xn+1 Números uniformes

0 4 3+3/8 3 3/8

1 3 2+6/8 6 6/8

2 6 4+5/8 5 5/8

3 5 4+0/8 0 0

4 0 0+7/8 7 7/8

5 7 5+2/8 2 2/8

6 2 2+1/8 1 1/8

7 1 1+4/8 4 4/8

Page 7: numeros aleatorios

II) Método congruencial multiplicativo :

Este método tiene la ecuación congruencial de recurrenciadonde

a = es la constante multiplicativa.m = es la magnitud del módulo.X0 = es la semilla.

los requisitos mínimos que deben satisfacer los parámetros sonX0, a, m > 0; enteros y m > a, m >X0

EJEMPLO 3. Desarrollar cinco iteraciones del generador Xn+1 = 3Xn mod 100, con X0=51.

Xn RND

51 0.51

53 0.53

59 0.59

77 0.77

31 0.31

Prueba de ji cuadrada

Esta prueba es aplicable para variables aleatorias discretas o continuas.

Sea una muestra aleatoria de tamaño n tomada de una población con una distribución especificada f0(x) que es de interés verificar.

Suponer que las observaciones de la muestra están agrupadas en k clases, siendo oi la cantidad de observaciones en cada clase i = 1, 2, ..., k

Con el modelo especificado f0(x) se puede calcular la probabilidad pi que un dato cualquiera pertenezca a una clase i.

Page 8: numeros aleatorios

Con este valor de probabilidad se puede encontrar la frecuencia esperada e i para la clase i, es decir, la cantidad de datos que según el modelo especificado deberían estar incluidos en la clase i:

ei= pi n, i = 1, 2, ..., k

Tenemos entonces dos valores de frecuencia para cada clase i

oi: frecuencia observada (corresponde a los datos de la muestra) ei: frecuencia esperada (corresponde al modelo propuesto)

La teoría estadística demuestra que la siguiente variable es apropiada para realizar una prueba de bondad de ajuste:

Dado un nivel de significancia α se define un valor crítico Xα2 para el rechazo de la

hipótesis propuesta Ho: f(x) = f0(x).Si las frecuencias observadas no difieren significativamente de las frecuencias esperadas calculadas con el modelo propuesto, entonces el valor de estadístico de prueba X2 será cercano a cero, pero si estas diferencias son significativas, entonces el valor del estadístico χ2 estará en la región de rechazo de

Ho

Page 9: numeros aleatorios

Código

Para implementar el generador de números aleatorios utilice el método congruencial mixto que anteriormente fue descrito, y me apoye en el lenguaje de C# de visual estudio 2012, creando una aplicación de consola, porque, ya tengo algo de experiencia programando de esta forma, únicamente era aplicar los formulas descritos por el método del generador y de la prueba de uniformidad, que en este caso utilice “Ji-cuadrada”.

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO;

namespace generador_ultimate{ class Program { static void Main(string[] args) {

//declaración de nuestras variables que vamos a utilizar en la generación de números//aleatorios, para evitar complicaciones utilizaremos las variables tipo “doublé” //(representa un numero de punto flotante de precisión doble)

double con1 = 0, con2 = 0, con3 = 0, con4 = 0, con5 = 0,con6=0,con7=0,con8=0,con9=0,con10=0; double a=269, c=245, mod=100000, x0, xn,n,total=0; double acumulado=16.92,FE,aux=0; double FE1, FE2, FE3, FE4, FE5, FE6, FE7, FE8, FE9, FE10,ji; double[] num = new double[10000];

//el siguiente método lo utilizo para almacenar en un archivo .txt los números //generados, los intervalos, su frecuencia observada, frecuencia esperado y los //resultados obtenidos de la prueba de Ji-cuadrada

using (StreamWriter writer = new StreamWriter("D:\\salida2.txt", false)) {

//para dar mayor grado de aleatoriedad le pedimos al usuario que ingrese la semilla //X0.

Console.WriteLine("por favor ingresa la semilla:"); x0=Convert.ToInt32(Console.ReadLine()); writer.WriteLine("generacion de numeros aleatorios"); writer.WriteLine("semilla ="+" "+x0); Console.WriteLine(" ");

Page 10: numeros aleatorios

// iniciamos el ciclo para generar los 10 mil números aleatorios, estos serán // almacenados en nuestro arreglo num[] que declaramos anteriormente

for (int i = 0; i < 10000; i++) { //metodo congruencial mixto xn = ((a * x0) + c) % mod; x0 = xn; n=( xn/mod); // Console.WriteLine( i+") " + n.ToString()); num[i] = n; Console.WriteLine(i + ") " + num[i]); writer.WriteLine(" "); writer.WriteLine(i + ") " + num[i]); }

//en este segundo for recorremos el arreglo para ir leyendo cada uno de los números //almacenados y hacer el conteo de la frecuencia observada de cada uno de los //intervalos for (int j = 0; j < num.Length; j++) {

if (num[j] <= 0.10 && num[j] >= 0.0) { con1 += 1; } if (num[j] <= 0.20 && num[j] > 0.10) { con2 += 1; } if (num[j] <= 0.30 && num[j] > 0.20) { con3 += 1; } if (num[j] <= 0.40 && num[j] > 0.30) { con4 += 1; } if (num[j] <= 0.50 && num[j] > 0.40) { con5 += 1; } if (num[j] <= 0.60 && num[j] >= 0.50) { con6 += 1; } if (num[j] <= 0.70 && num[j] > 0.60) { con7 += 1; } if (num[j] <= 0.80 && num[j] > 0.70) { con8 += 1; } if (num[j] <= 0.90 && num[j] > 0.80) {

Page 11: numeros aleatorios

con9 += 1; } if (num[j] <= 1 && num[j] > 0.90) { con10 += 1; } total = con1 + con2 + con3 + con4 + con5 + con6 + con7 + con8 + con9 + con10; }

// a continuación calcularemos la frecuencia esperada de cada intervalo para eso la sacamos la frecuencia esperada general FE=N(total de la población)/(número de //intervalos) FE = total / 10; //calculamos frecuencia esperada del intervalo 1 aux = (FE - con1); FE1 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 2 aux = (FE - con2); FE2 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 3 aux = (FE - con3); FE3 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 4 aux = (FE - con4); FE4 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 5 aux = (FE - con5); FE5 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 6 aux = (FE - con6); FE6 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 7 aux = (FE - con7); FE7 = (aux * aux)/FE; aux = 0; //calculamos frecuencia esperada del intervalo 8 aux = (FE - con8); FE8 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 9 aux = (FE - con9); FE9 = (aux * aux) / FE; aux = 0; //calculamos frecuencia esperada del intervalo 10 aux = (FE - con10); FE10 = (aux * aux) / FE; aux = 0;

Page 12: numeros aleatorios

// con los resultados obtenidos calculamos Ji-cuadrada, esto es para ver si hay //uniformidad en nuestro modelo, aplicamos la fórmula que anteriormente se describió

ji = FE1 + FE2 + FE3 + FE4 + FE5 + FE6 + FE7 + FE8 + FE9 + FE10;

//por ultimo imprimimos los resultados en pantalla y los almacenamos en el archivo //txt que se creó al principio del código writer.WriteLine(" "); Console.WriteLine("total de numeros generados: " + total); writer.WriteLine("total de numeros generados: " + total); Console.WriteLine(" "); writer.WriteLine(" "); Console.WriteLine(" intervalos"+" FO "+ "FE"); writer.WriteLine(" intervalos" + " FO "+ "FE"); Console.WriteLine("total 0.00-0.10: " + con1 +" "+ FE1.ToString()); writer.WriteLine("total 0.00-0.10: " + con1 +" "+ FE1); Console.WriteLine("total 0.11-0.20: " + con2 +" "+ FE2.ToString()); writer.WriteLine("total 0.11-0.20: " + con2 +" "+ FE2); Console.WriteLine("total 0.21-0.30: " + con3 +" "+ FE3.ToString()); writer.WriteLine("total 0.21-0.30: " + con3 +" "+ FE3); Console.WriteLine("total 0.31-0.40: " + con4 +" "+ FE4.ToString()); writer.WriteLine("total 0.31-0.40: " + con4 +" "+ FE4); Console.WriteLine("total 0.41-0.50: " + con5 +" "+ FE5.ToString()); writer.WriteLine("total 0.41-0.50: " + con5 +" "+ FE5); Console.WriteLine("total 0.51-0.60: " + con6 +" "+ FE6.ToString()); writer.WriteLine("total 0.51-0.60: " + con6 +" "+ FE6); Console.WriteLine("total 0.61-0.70: " + con7 +" "+ FE7.ToString()); writer.WriteLine("total 0.61-0.70: " + con7 +" "+ FE7); Console.WriteLine("total 0.71-0.80: " + con8 +" "+ FE8.ToString()); writer.WriteLine("total 0.71-0.80: " + con8 +" "+ FE8); Console.WriteLine("total 0.81-0.90: " + con9 +" "+ FE9.ToString()); writer.WriteLine("total 0.81-0.90: " + con9 +" "+ FE9); Console.WriteLine("total 0.91-1.0 : " + con10 +" "+ FE10.ToString()); writer.WriteLine("total 0.91-1.0 : " + con10 +" "+ FE10); Console.WriteLine(" "); writer.WriteLine(" "); Console.WriteLine("la suma de ji cuadrada es: " + ji.ToString()); writer.WriteLine("la suma de ji cuadrada es: " + ji); Console.WriteLine(" "); writer.WriteLine(" ");

Page 13: numeros aleatorios

//para verificar si hay uniformidad comparamos el valor de Ji-cuadrada con los //grados de liberta en este caso acumulado= 16.92 según la tabla de grados de //liberta de Ji-cuadrada if (ji < acumulado) { Console.WriteLine(ji + " < " + acumulado.ToString()); writer.WriteLine(ji + " < " + acumulado); Console.WriteLine(" "); writer.WriteLine(" "); Console.WriteLine(" si hay uniformidad!!"); writer.WriteLine("si hay uniformidad!!"); } else { Console.WriteLine(ji + " < " + acumulado.ToString()); writer.WriteLine(ji + " < " + acumulado); Console.WriteLine(" "); writer.WriteLine(" "); Console.WriteLine(" no hay uniformidad!!"); writer.WriteLine("no hay uniformidad!!"); }

} Console.ReadKey(); } }}

Prueba 1:generacion de numeros aleatoriossemilla = 99

total de numeros generados: 10000 intervalos FO FEtotal 0.00-0.10: 1045 2.025total 0.11-0.20: 1032 1.024total 0.21-0.30: 1063 3.969total 0.31-0.40: 1007 0.049total 0.41-0.50: 980 0.4total 0.51-0.60: 955 2.025total 0.61-0.70: 968 1.024total 0.71-0.80: 937 3.969total 0.81-0.90: 993 0.049

Page 14: numeros aleatorios

total 0.91-1.0 : 1020 0.4 la suma de ji cuadrada es: 14.934 14.934 < 16.92 si hay uniformidad!!

Prueba 2:

generacion de numeros aleatoriossemilla = 113

total de numeros generados: 10000 intervalos FO FEtotal 0.00-0.10: 1043 1.849total 0.11-0.20: 968 1.024total 0.21-0.30: 983 0.289total 0.31-0.40: 1055 3.025total 0.41-0.50: 995 0.025total 0.51-0.60: 957 1.849total 0.61-0.70: 1032 1.024total 0.71-0.80: 1017 0.289total 0.81-0.90: 945 3.025total 0.91-1.0 : 1005 0.025 la suma de ji cuadrada es: 12.424 12.424 < 16.92

si hay uniformidad!!

Figura1. Prueba 1

Page 15: numeros aleatorios

Conclusiones

Como pudimos observar en las pruebas nuestro modelo de generación de números aleatorios si cumplió con la prueba de Ji-cuadrada, por lo que podemos decir que el modelo si genera números aleatorios con una distribución uniforme, por lo tanto basado en las pruebas el modelo es considerado aceptable.

Figura2. Prueba 2