Está en la página 1de 11

1

Reporte primera prctica del 2012

8 de febrero

Autor: Del Castillo Hoffman Guillermo Miguel 2093307 71

NDICE Parte 1 Introduccin Cdigo fuente Impresiones de pantalla Observaciones y comentarios Parte 2, Utilizacin de un generador congruencial lineal Observaciones y conclusiones Cdigo fuente Impresin de pantalla 1 1 2 3 5 6 7 8 9

Parte 1
Introduccin Esta parte de la prctica consiste en la implementacin de un generador de nmeros pseudoaleatorios del tipo congruencial lineal, siendo ste desarrollado bajo VBA en Excel. Dicho algoritmo generador de nmeros pseudoaleatorios (PRNG por sus siglas en ingls) es uno de los ms antigos y mejor conocidos. Es fcilmente implementable y rpido computacionalmente. Se utiliza ampliamente en varios compiladores y libreras runtime como generador dentro de las funciones rand(). Se define a este generador mediante la siguiente funcin recursiva: Xn=aXn-1+c mod m , Xn , a , c , m Z , Xn[0 , m-1] Dado que dicho generador ser utilizado para simulaciones que involucran variables aleatorias probabilsticas, se procurar que el rango de los nmeros aleatorios est entre cero y uno mediante el siguiente clculo:

2 Un= Xnm 0 Un <1 Se probarn cuatro juegos de los parmetros a , c , m mencionados anteriormente, utilizando como X0=389 en todos los casos: Caso Caso Caso Caso 1: 2: 3: 4: a a a a = = = = 25214903917, c = 11 y m = 248 (parmetros de Java) 1103515245, c = 12345 y m = 232 (parmetros de GCC) 237, c = 0 y m = 18989 37, c = 3 y m = 1283

Se generarn en cada caso 10,000 nmeros aleatorios y, de la misma manera, en cada caso se graficar Uj+1=f(Uj) con el propsito de indicar la calidad de la aleatoriedad simulada en los cuatro juegos de parmetros. Cdigo fuente
Option Explicit Dim i As Long 'ndice utilizado en los ciclos, variable global. Sub Main() Dim N As Long 'Dimensin del vector resultante, cantidad de PRGN aleatorios. Dim PRGN() As Double 'Vector resultante donde se contendrn los PRGNs. 'Input N = InputBox("Introduce la cantidad de PRGNs a generar") ReDim PRGN(N) As Double Call RutLCG(N, PRGN()) 'Output For i = 1 To N Cells(i + 1, 4).Value = PRGN(i) Next i For i = 1 To 20 Cells(i + 1, 2).Value = PRGN(i) Cells(i + 1, 1).Value = i Next i MsgBox ("La ejecucin ha finalizado exitosamente. Ver hoja de clculo con los resultados") End Sub 'Rutina de Generador Congruencial Lineal (LCG) Sub RutLCG(N As Long, Vector() As Double) Dim Dim Dim Dim a As Double, c As Double, m As Double 'Parmetros del LCG. Xo As Integer 'Semilla de la frmula de un LCG. Xold As Double, Xnew As Double 'Variables para las iteraciones de la generacin de PRGNs. Cociente As Double 'Variable utilizada en la funcin mdulo si no se estn usando enteros.

'Inputs a = InputBox("Introducir el valor de 'a'") c = InputBox("Introducir el valor de 'c'") m = InputBox("Introducir el valor de 'm'") Xo = InputBox("Introducir el valor de 'Xo'")

3
Xold = Xo For i = 1 To N Cociente = Int((a * Xold + c) / m) Xnew = (a * Xold + c) - (Cociente * m) 'Xnew = ((a * Xold) + c) Mod m '(Funcin de mdulo directa, no utilizada). Vector(i) = (Xnew / m) Xold = Xnew Next i End Sub

Impresiones de pantalla

Observaciones y comentarios Sobre los casos 1 y 2, se observa que no es inmediatamente discernible un patrn en las imgenes. Es difcil concluir qu conjunto de parmetros es ms eficaz. Aparentemente en el caso 1 los puntos tienden a concentrarse ms entre ellos, dejando espacios en blanco ms grandes observacin que puede ser indicativa de un patrn; tanto que en el caso 2 la distribucin aleatoria de puntos aparenta mayor uniformidad. Es importante mencionar que en el caso 1 al declarar las variables correspondientes a los parmetros como enteras (LongLong en el caso de Visual Basic, el entero de mayor capacidad disponible) se produce un overflow al realizar el clculo de la funcin recursiva, obligando a declarar los parmetros como Double aunque los resultados de los clculos sean nmeros enteros. En el caso 2, sin embargo, se puede mantener la declaracin de variables como LongLong sin que esto sucite un desbordamiento, evitando entonces desperdicio de memoria en los clculos y con la conveniencia de que no se tiene que programar la funcin mdulo y se permite utilizar la funcin mod de VB dado que slo es vlido utilizarla con valores enteros. Para propsitos prcticos, se deja el cdigo fuente con los parmetros declarados como Double. Sobre los casos 3 y 4, es evidente tanto la aparicin de patrones geomtricos formados por los puntos como la repeticin de los nmeros pseudoaleatorios, dado que a pesar de seguirse generando diez mil nmeros, slo se ven unos cuntos en la grfica. Se debe notar que es aparente una mayor aleatoriedad en el caso 3 aunque hay una menor cantidad de puntos. Se

6 nota una alineacin de los puntos en un sentido diagonal hacia ambos lados, sin embargo en otros ejes las lneas son menos notorias. Tal vez algunas lneas curvas se puedan inferir de la imagen pero es difcil determinar si son un patrn. En el caso 4 es muy notoria la alineacin de todos los puntos en sentidos horizontal, vertical y diagonal hacia ambos lados, siguiendo un patrn casi isomtrico. No se nota ninguna sucesin que aproxime una curva y es evidente que se puede inferir la posicin de todos los puntos generados con guas de lneas rectas. En el nico apartado donde aparenta ser superior esta configuracin de parmetros con respecto al caso 3 es en la menor cantidad de puntos repetidos. Por su mayor calidad aparente de aleatoriedad y por la posibilidad de ser implementado con menor uso de memoria y facilitando la programacin, se utilizarn los parmetros de GCC (caso 2).

Parte 2
Utilizacin del generador congruencial lineal Esta parte consiste en resolver el ejercicio siguiente: El peso de los costales de cemento saliendo de una planta es una variable aleatoria X, uniformemente distribuida entre los valores extremos 18.64 y 20.98 (kg). Realice un estudio de simulacin para calcular la media y la desviacin estndar del peso de los costales. Para ello, utilice el generador de nmeros pseudoaleatorios implementado en la parte anterior para generar 4,000 valores de X. Deduzca de estos nmeros los valores de la media y la desviacin estndar de la variable aleatoria X. Estos resultados corresponden a los valores tericos? Los valores tericos antes mencionados corresponden a las definiciones de media y desviacin estndar de la distribucin uniforme de probabilidad. Los valores experimentales se considerarn la media muestral como la suma de todas las muestras simuladas dividido entre el nmero de ellas y a la desviacin estndar como la raz cuadrada de la varianza muestral. De manera automtica se obtuvieron ambos datos muestrales mediante funciones de Excel. Tambin se pide realizar la simulacin con diferentes cantidades de valores de X, entre 500 y 10,000. En la tabla siguiente se muestran los valores obtenidos mediante el experimento de simulacin.

Datos experimentales [kg]

Datos tericos [kg]

8 Para N = 500 Desv. Estndar Media 0.6809935391 07 19.82567302 8380

Para N = 1500 Desv. Estndar Media 0.681489941 318 19.83648669 1734

=(b-a)212= (20.98-18.64)212=0.675499815

Para N = 4000 Desv. Estndar Media 0.674637987 492 19.80889339 0262 = a+b2= 18.64+20.982=19.81 0.674889395 841 19.80979403 5350

Para N = 8000 Desv. Estndar Media

Para N = 10000 Desv. Estndar Media 0.674591396 376 19.81043667 9232

Adicionalmente, por mera curiosidad, se realiz la simulacin con 100,000 nmeros aleatorios, obtenindose como desviacin estndar 0.674375814312 y como media 19.810988367842.

Observaciones y conclusiones Se puede observar que el requisito inicial de 4,000 nmeros aleatorios aproxima a los valores tericos hasta la centsima en la desviacin estndar y la dcima en la media. La aproximacin es un tanto mejor con 8,000 nmeros y al llegar a los 10,000 la aproximacin es hasta la milsima en la media sin que en la desviacin estndar se aprecie mejora en el clculo.

9 Dado que las cantidades iniciales del estudio de simulacin tienen una precisin de centsimas, es notorio que el experimento resulta ms preciso cerca de las 10,000 iteraciones de nmeros aleatorios. Desconcierta hasta cierto punto el que no se aprecie que converja a las cantidades tericas mucho ms alrededor de las 8,000 iteraciones. Incluso con 100,000 iteraciones, la precisin de la desviacin estndar an no corresponde en la milsima con el valor terico, y el valor de la media incluso es un tanto ms alejado en las diezmilsimas con respecto al obtenido en 10,000 iteraciones. En general, la simulacin es exitosa para acercarse a los valores tericos, siempre y cuando uno evite generar alrededor de 1,500 nmeros aleatorios o menos. Parece ser que cualquier nmero mayor a las 8,000 ~ 9,000 iteraciones es un desperdicio de tiempo de clculo, la sensibilidad no aumenta significativamente. Es posible que se necesite de un mejor generador de nmeros aleatorios para lograr una sensibilidad mayor.

10

Cdigo fuente
Option Explicit Dim i As Long 'ndice utilizado en los ciclos. Sub Main() Dim Dim Dim Dim Dim N As Long 'Dimensin del vector a As LongLong, c As LongLong, m Xo As Integer 'Semilla del LCG. Ui() As Double 'Vector donde se Xi() As Double 'Vector donde se resultante, cantidad de PRGN aleatorios. As LongLong 'Representativos de la frmula de un LCG. contendrn los PRGNs entre 0 y 1. mapearn los PRGNs al intervalo deseado.

'Inputs, utilizando el LCG del GCC a = 1103515245 c = 12345 m = 4294967296# Xo = InputBox("Introducir la semilla (Xo)") N = InputBox("Introducir la cantidad de numeros aleatorios deseada") ReDim Ui(N) As Double ReDim Xi(N) As Double Call RutLCG(a, c, m, N, Xo, Ui()) 'Mapeando los PRGN al intervalo del modelo For i = 1 To N Xi(i) = (Ui(i) * (20.98 - 18.64)) + 18.64 Next i 'Output For i = 1 To N Cells(i + 1, 4).Value = Xi(i) Next i For i = 1 To 20 Cells(i + 1, 2).Value = Xi(i) Cells(i + 1, 1).Value = i Next i MsgBox ("La generacion de numeros aleatorios se realizo exitosamente.") End Sub 'Rutina de Generador Congruencial Lineal (LCG) Sub RutLCG(a As LongLong, c As LongLong, m As LongLong, N As Long, Xo As Integer, Vector() As Double) Dim Xold As LongLong, Xnew As LongLong 'Dim Cociente As Double 'No se usa pues estamos utilizando los parmetros de GCC Xold = Xo For i = 1 To N 'Cociente = Int((a * Xold + c) / m) 'Xnew = (a * Xold + c) - (Cociente * m) Xnew = ((a * Xold) + c) Mod m Vector(i) = (Xnew / m) Xold = Xnew Next i

11
End Sub

Impresin de pantalla

También podría gustarte