I Examen Parcial (2da Parte)

Esquema del modelo

Tirar dos dados de seis lados

Sabemos que las probabilidades de nuestra variable aleatoria XX (los valoes del dado de 2 al 12 que son obtenidos tras sumar de valores de los dados) son p(X=2)=136,p(X=3)=236,p(X=4)=336,p(X=5)=436,p(X=6)=536,p(X=7)=636,p(X=8)=536,p(X=9)=436,p(X=10)=336,p(X=11)=236,p(X=12)=136p(X=2)=\dfrac{1}{36},p(X=3)=\dfrac{2}{36},p(X=4)=\dfrac{3}{36},p(X=5)=\dfrac{4}{36},p(X=6)=\dfrac{5}{36},p(X=7)=\dfrac{6}{36},p(X=8)=\dfrac{5}{36},p(X=9)=\dfrac{4}{36},p(X=10)=\dfrac{3}{36},p(X=11)=\dfrac{2}{36},p(X=12)=\dfrac{1}{36} Por el teorema de los grandes números después de un número grande de lanzamientos tendrá converger a esos valores; nuestra hipótesis es que X=7X=7 es el valor con mayor probabilidad de ocurrir. También sigue una distribución de Bernoulli. Dicho número grande está dado por el umbral de error que queremos asumir.

Simulación

Generamos una matriz de experimentos dado el evento de tirar dos dados de seis lados y sumar ambas caras. La idea es separar el experimento de las repeticiones.

simulate(
    lambda: [sum([random.randint(1, 6),random.randint(1, 6)])], 
    lambda experiment: [experiment() for _ in range(0,50000)]
)

Formulación del modelo

El generador pseudoaleatorio congruencial mixto es un algoritmo que permite generar números pseudoaleatorios a partir de una semilla inicial. La relación de recurrencia es:

Xn+1=(aXn+C) mod mX_{n+1} = (aX_n + C) \text{ mod } m

Donde:

Para calcular los valores apropiados de a, C y m, se deben cumplir ciertas condiciones para garantizar la calidad de la secuencia de números generados (Teorema de Hull–Dobell):

Para este ejemplo, se elegirán los siguientes valores (los cuales son usados en C++ minstd_rand):

Código

# Numerical Recipes from the "quick and dirty generators" list, Chapter 7.1, Eq. 7.1.6 parameters from Knuth and H. W. Lewis
def mixed_congruential_generator(seed=[math.floor(time.time()+10000)], m=2**32, a=1664525, c=1013904223):
   seed[0] = (a*seed[0] + c) % m
   return seed[0]

def random():
  return mixed_congruential_generator()/ 2**32

def randint(min, max):
  return int(random()*(max-min+1))+min

mixed_congruential_generator genera los valores pseudoaleatorios, cada vez que es llamada genera un valor distinto, aunque como sabemos tarde o temprano veremos un patrón. El resto son utilidades, random normaliza la función previa (esto es, la funcion genera valores en [0,1)[0,1)). randint valores enteros.

Resultados

Podemos observar que tras n=6000n=6000  experimentos (lanzamientos del con nuestro generador pseudoaleatorio) el resultado con mayor frecuencia es el 7. Con estadísticos: la media es 7.015, varianza 5.914 y desviación estándar 2.4318.