I Examen Parcial (2da Parte)
Esquema del modelo
Tirar dos dados de seis lados
Sabemos que las probabilidades de nuestra variable aleatoria (los valoes del dado de 2 al 12 que son obtenidos tras sumar de valores de los dados) son 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 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:
Donde:
- es el número generado en el paso n.
- m es el módulo, .
- a es el multiplicador, .
- C es la constante aditiva o el incrmento . (si el generador es llamado congruencial mixto)
- es la semilla o el valor inicial, . Suele ser la hora actual del sistema.
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):
- m y C deben ser primos relativos entre sí ().
- a - 1 debe ser divisible por todos los factores primos de m.
- Si m es divisible por 4, entonces a - 1 debe ser divisible por 4.
Para este ejemplo, se elegirán los siguientes valores (los cuales son usados en C++ minstd_rand
):
- , que es un número primo muy grande.
- , que cumple con las condiciones mencionadas.
- , que también las cumple.
- la hora del sistema
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 ). randint
valores enteros.
Resultados
Podemos observar que tras 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.