sábado, 17 de noviembre de 2012

La historieta de Martin y Gala: simulación por ordenador


En esta entrada voy a plantear una resolución de la historia de Martin y Gala, utilizando una simulación por ordenador. (Entrada relacionada: resolución desde una perspectiva probabilística)

Las simulaciones por ordenador nos permiten realizar modelos de situaciones reales que de otra forma su estudio sería mucho más complejo (o inabordables/ineficientes desde un punto de vista temporal) y actualmente son muy frecuentes en la investigación en matemáticas y en otros campos.

Un ejemplo muy simple de simulación por ordenador es el de repetir una gran cantidad de veces un experimento aleatorio, como el del caso que nos ocupa de la historia de Martin y Gala.

Haciendo un pequeño programa en C (ver código al final de la entrada) podemos simular la historia de Martin y Gala. En menos de 10 segundos en mi ordenador puedo simular 1.000.000 de veces la historia. Es decir, han pasado por delante de Martin 1.000.000 de invitados que han tirado la moneda hasta conseguir los 8 puntos que les exige para poder pasar a Gala. Al final el programa devuelve la media de las preguntas que les ha hecho Martin antes de dejarles pasar.

Estos son los resultados que he obtenido al ejecutar 10 veces el programa:
255'136; 254'823; 255'6; 254'911; 255'42; 255'322; 254'84; 254'616; 254'954; 255'282;

Vemos que los resultados son bastante estables alrededor de 255. Por lo que según estas simulaciones cabe esperar que los invitados tengan que responder 255 preguntas de Martin antes de conseguir los 8 puntos que les permita pasar a Gala.

Una cuestión interesante es que podemos investigar qué pasa con el resultado cuando cambiamos los distintos valores del programa (como el número de simulaciones o los puntos necesarios).

//////////////////////////////////////////////////////////////////////////////////////////////////////
Código fuente del programa en C:
#include < stdlib.h >
#include < iostream >
#include < time.h >

main()
{
    srand(time(NULL));
    unsigned int puntos=0, aleatorio=0, puntosNecesarios=8;
    unsigned long int preguntas=0, sumaPreguntas=0, vecesSimulacion=1000000;
    for(unsigned int n=0; n < vecesSimulacion; n++)
    {
        puntos=0;
        preguntas=0;
        while(puntos < puntosNecesarios)
        {
            aleatorio=rand()%2;
            if(aleatorio==0)
            {
                puntos=0;
                preguntas++;
            }
            else
            {
                puntos++;
            }
        } //while
        sumaPreguntas+=preguntas;
    } //for n
    std::cout < < "Media de preguntas antes de pasar: " < < (float)sumaPreguntas/(float)vecesSimulacion < < std::endl;
    return 0;
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

No hay comentarios: