Vous êtes sur la page 1sur 15

INSTITUTO TECNOLGICO DE ACAPULCO

INGENIERIA EN SISTEMAS COMPUTACIONALES

Modelado Virtual
Profesor: Dr. De La Cruz Gmez Eduardo
Generacin de nmeros aleatorios Alumno:

Rodrguez Martnez Juan Manuel

09320873

26 de Septiembre de 2013

Introduccin
Un nmero aleatorio es aquel obtenido al azar, es decir, que todo nmero tenga la misma probabilidad de ser elegido y que la eleccin de uno no dependa de la eleccin del otro. El ejemplo clsico ms 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 nmeros aleatorios Los seres humanos vivimos en un medio aleatorio y nuestro comportamiento lo es tambin. Si deseamos predecir el comportamiento de un material, de un fenmeno climatolgico o de un grupo humano podemos inferir a partir de datos estadsticos. Para lograr una mejor aproximacin a la realidad nuestra herramienta predictiva debe funcionar de manera similar: aleatoriamente. De esa necesidad surgieron los modelos de simulacin. En la vida cotidiana se utilizan nmeros aleatorios en situaciones tan dispares como pueden ser los juegos de azar, en el diseo de la cada de los copos de nieve, en una animacin por ordenador, en test para localizacin de errores en chips, en la transmisin de datos desde un satlite o en las finanzas.

Como se pueden generar los nmeros aleatorios.


La lgica nos hace pensar que las personas somos generadores aleatorios imperfectos, hay estudios que demuestran que existen tendencias claras en los humanos para la elaboracin de secuencias sesgadas y estn relacionadas con caractersticas personales, con los conocimientos o informaciones previas o con la edad. Mtodos manuales, lanzamiento de monedas, lanzamientos dispositivos mecnicos, dispositivos electrnicos de dados,

Mtodos de computacin analgica, son mtodos que dependen de ciertos procesos fsicos aleatorios, por ejemplo, el comportamiento de una corriente elctrica. Mtodos de computacin digital, cuando se usa el ordenador digital.

Tablas de bibliotecas, son nmeros aleatorios que se han publicado; de los cuales podemos encontrar listas en los libros de probabilidad y tablas de matemticas. Estos nmeros fueron generados por alguno de los mtodos de computacin analgica

Que son los nmeros pseudoaleatorios


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

Nmeros aleatorios vs pseudoaleatorios


Las sucesiones de nmeros pseudoaleatorios son ms rpidas de generar que las de nmeros aleatorios. Si las personas tenemos dificultad en generar nmeros aleatorios, mucho ms la tiene un ordenador, la dificultad est en que un ordenador es tan "torpe" que no sabe generarlos. Por eso usan nmeros pseudoaleatorios, que para nuestro fin es lo mismo, pues nadie los puede predecir.

Aplicaciones de los nmeros aleatorios


En el corazn de todos los sistemas criptogrficos, est la generacin de nmeros secretos que no puedan ser adivinados por otra persona, es decir aleatorios. Es claro que la seguridad de la informacin es importante para el comercio electrnico. Los servicios de seguridad estn basados en mecanismos de criptografa, los cuales hacen uso de nmeros aleatorios. Estos son utilizados para: Mecanismos de autenticacin (usando una clave generada como numero aleatorio) para proteger el mensaje. Mecanismos de confidencialidad utilizan llaves secretas o llaves de sesin para proteger datos durante un intercambio de informacin.

Mecanismos de firma digital requieren llaves privadas, los cuales son generados de nmeros aleatorios.

Mtodos para generar nmeros aleatorios


Algunos mtodos para la generacin de nmeros aleatorios son: 1) El mtodo de los cuadrados del medio, debido a Von Newmann y Ulam. 2) Mtodos congruenciales, desarrollados por Lehmer I) Mixto. II) Multiplicativo

Mtodo de los cuadrados del medio Este mtodo consiste en generar aleatoriamente un nmero de cuatro dgitos, denominado la semilla, elevarlo al cuadrado y establecer una forma de tomar los cuatro nmeros centrales del resultado de la exponenciacin, ya sea quitando dos o un slo dgito de cada extremo del resultado. EJEMPLO 1. Sea la semilla RND0 = 4380, (obtenida aleatoriamente con el procedimiento 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 nmero impar de dgitos, 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 dgito tanto a la izquierda como a la derecha, por lo que:

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

RND5 =1776; y as sucesivamente hasta obtener el tamao de muestra deseado, o bien hasta que el procedimiento se degenere repitiendo una serie de nmeros previamente generados. Si eventualmente se obtiene la semilla inicial, a la cantidad de nmeros obtenida se le llama perodo del generador.

Mtodos congruenciales Los mtodos congruenciales estn basados en el lgebra de congruencias. I) El Mtodo congruencial mixto El mtodo mixto tiene la siguiente ecuacin de recurrencia:

Donde a = es la constante multiplicativa. c = es la constante aditiva. m = es la magnitud del mdulo. X0 = es la semilla. Los requisitos mnimos que estos parmetros deben satisfacer son: X0, a, c, m >= 0; enteros y m > a, m > c, m > X0 Aqu mod representa a la operacin aritmtica mdulo entre los enteros a y b tal que el resultado de (a mod b) es el residuo entero de la divisin a entre b.

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 sucesin obtenida se repetir. En la siguiente tabla se muestran los resultados, obsrvese que Xi es el resultado de la operacin mdulo, mientras que RNDi es el correspondiente valor en decimales. Generador Xn+1=(5Xn+7) mod 8 n 0 1 2 3 4 5 6 7 Xn 4 3 6 5 0 7 2 1 (5Xn+7)/8 3+3/8 2+6/8 4+5/8 4+0/8 0+7/8 5+2/8 2+1/8 1+4/8 Xn+1 3 6 5 0 7 2 1 4 Nmeros uniformes 3/8 6/8 5/8 0 7/8 2/8 1/8 4/8

II) Mtodo congruencial multiplicativo : Este mtodo tiene la ecuacin congruencial de recurrencia donde

a = es la constante multiplicativa. m = es la magnitud del mdulo. X0 = es la semilla. los requisitos mnimos que deben satisfacer los parmetros son X0, 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 51 53 59 77 31 RND 0.51 0.53 0.59 0.77 0.31

Prueba de ji cuadrada

Esta prueba es aplicable para variables aleatorias discretas o continuas. Sea una muestra aleatoria de tamao n tomada de una poblacin con una distribucin especificada f0(x) que es de inters verificar. Suponer que las observaciones de la muestra estn 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.

Con este valor de probabilidad se puede encontrar la frecuencia esperada ei para la clase i, es decir, la cantidad de datos que segn el modelo especificado deberan estar incluidos en la clase i: ei= pi n, i = 1, 2, ..., k

Tenemos entonces dos valores de frecuencia para cada clase i o i: e i: frecuencia observada (corresponde a los datos de la muestra) frecuencia esperada (corresponde al modelo propuesto)

La teora estadstica demuestra que la siguiente variable es apropiada para realizar una prueba de bondad de ajuste:

Dado un nivel de significancia se define un valor crtico X2 para el rechazo de la hiptesis 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 estadstico de prueba X2 ser cercano a cero, pero si estas diferencias son significativas, entonces el valor del estadstico 2 estar en la regin de rechazo de Ho

Cdigo
Para implementar el generador de nmeros aleatorios utilice el mtodo congruencial mixto que anteriormente fue descrito, y me apoye en el lenguaje de C# de visual estudio 2012, creando una aplicacin de consola, porque, ya tengo algo de experiencia programando de esta forma, nicamente era aplicar los formulas descritos por el mtodo del generador y de la prueba de uniformidad, que en este caso utilice Ji-cuadrada.

using using using using using using

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

namespace generador_ultimate { class Program { static void Main(string[] args) { //declaracin de nuestras variables que vamos a utilizar en la generacin de nmeros //aleatorios, para evitar complicaciones utilizaremos las variabl es tipo doubl //(representa un numero de punto flotante de precisin 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 mtodo lo utilizo para almacenar en un archivo .txt los nmeros //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(" ");

// iniciamos el ciclo para generar los 10 mil nmeros aleatorios, estos sern // 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 nmeros //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 { con1 += 1; } if (num[j] <= 0.20 { con2 += 1; } if (num[j] <= 0.30 { con3 += 1; } if (num[j] <= 0.40 { con4 += 1; } if (num[j] <= 0.50 { con5 += 1; } if (num[j] <= 0.60 { con6 += 1; } if (num[j] <= 0.70 { con7 += 1; } if (num[j] <= 0.80 { con8 += 1; } if (num[j] <= 0.90 { con9 += 1; && num[j] >= 0.0)

&& num[j] > 0.10)

&& num[j] > 0.20)

&& num[j] > 0.30)

&& num[j] > 0.40)

&& num[j] >= 0.50)

&& num[j] > 0.60)

&& num[j] > 0.70)

&& num[j] > 0.80)

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

// a continuacin calcularemos la frecuencia esperada de cada intervalo para eso la sacamos la frecuencia esperada general FE=N(total de la poblacin)/(nmero 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;

// con los resultados obtenidos calculamos Ji-cuadrada, esto es para ver si hay //uniformidad en nuestro modelo, aplicamos la frmula 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 cdigo 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 Console.WriteLine("total 0.11-0.20: " + con2 FE2.ToString()); writer.WriteLine("total 0.11-0.20: " + con2 Console.WriteLine("total 0.21-0.30: " + con3 FE3.ToString()); writer.WriteLine("total 0.21-0.30: " + con3 Console.WriteLine("total 0.31-0.40: " + con4 FE4.ToString()); writer.WriteLine("total 0.31-0.40: " + con4 Console.WriteLine("total 0.41-0.50: " + con5 FE5.ToString()); writer.WriteLine("total 0.41-0.50: " + con5 Console.WriteLine("total 0.51-0.60: " + con6 FE6.ToString()); writer.WriteLine("total 0.51-0.60: " + con6 Console.WriteLine("total 0.61-0.70: " + con7 FE7.ToString()); writer.WriteLine("total 0.61-0.70: " + con7 Console.WriteLine("total 0.71-0.80: " + con8 FE8.ToString()); writer.WriteLine("total 0.71-0.80: " + con8 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(" "); +" +" "+ FE8); "+ +" +" "+ FE7); "+ +" +" "+ FE6); "+ +" +" "+ FE5); "+ +" +" "+ FE4); "+ +" +" "+ FE3); "+ +" +" "+ FE2); "+ +" +" "+ FE1); "+

//para verificar si hay uniformidad comparamos el valor de Ji-cuadrada con los //grados de liberta en este caso acumulado= 16.92 segn 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 aleatorios semilla = 99 total de numeros generados: 10000 intervalos FO FE total 0.00-0.10: 1045 2.025 total 0.11-0.20: 1032 1.024 total 0.21-0.30: 1063 3.969 total 0.31-0.40: 1007 0.049 total 0.41-0.50: 980 0.4 total 0.51-0.60: 955 2.025 total 0.61-0.70: 968 1.024 total 0.71-0.80: 937 3.969 total 0.81-0.90: 993 0.049 total 0.91-1.0 : 1020 0.4 la suma de ji cuadrada es: 14.934 14.934 < 16.92 si hay uniformidad!!

Figura1. Prueba 1

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

si hay uniformidad!!

Figura2. Prueba 2

Conclusiones

Como pudimos observar en las pruebas nuestro modelo de generacin de nmeros aleatorios si cumpli con la prueba de Ji-cuadrada, por lo que podemos decir que el modelo si genera nmeros aleatorios con una distribucin uniforme, por lo tanto basado en las pruebas el modelo es considerado aceptable.

Vous aimerez peut-être aussi