Algoritmo para o problema de Monty Hall

O problema de Monty Hall é um problema matemático que envolve a probabilidade de ser bem sucedido na escolha de uma porta que possui um prêmio. Para saber mais sobre esse problema, recomendo a leitura de https://pt.wikipedia.org/wiki/Problema_de_Monty_Hall.

Eu fiz o vídeo a seguir para falar sobre o problema de Monty Hall e o algoritmo que desenvolvi. Após o vídeo é possível ter acesso ao algoritmo desenvolvido.

https://youtu.be/R2L-Ym8b7wE

Como o problema de Monty Hall depende de valores aleatórios, recomendo a leitura do meu guia sobre geração de valores aleatórios em C.

Aqui eu trago um algoritmo que simula várias “jogadas” na escolha das portas para comprovação dos resultados. O algoritmo utiliza a geração de valores aleatórios e contadores para calcular a quantidade de vitórias. O código a seguir é uma primeira parte relacionada com o problema, apenas permitindo que o jogador escolha uma porta e não faça a troca de porta. Como resultado da execução desse código é esperado uma taxa de vitórias em torno de 33%, ou seja, vitória em 1/3 (um terço) das jogadas.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TOTAL 3

int main() {
    srand(time(NULL));
    int porta, escolha, revelada, jogadas, vitorias=0;

    for (jogadas=0; jogadas<TOTAL; jogadas++) {
        porta = rand()%3;
        escolha = rand()%3;
        printf("Escolheu %i e era %i. ", escolha, porta);

        if (porta == escolha) {
            printf("Ganhou!\n");
            vitorias++;
        } else {
            printf("Perdeu!\n");
        }
    }
    printf("\nGanhou %i e perdeu %i. Proporcao %i%%", vitorias, TOTAL-vitorias, vitorias*100/TOTAL);
    return 0;
}

O código abaixo adiciona o restante dos elementos do problema, revelando uma porta e fazendo o jogador trocar a porta escolhida inicialmente. A execução desse código gerará resultados em torno de 66% no número de vitórias.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TOTAL 3000

int main() {
    srand(time(NULL));
    int porta, escolha, revelada, jogadas, vitorias=0;

    for (jogadas=0; jogadas<TOTAL; jogadas++) {
        porta = rand()%3;
        escolha = rand()%3;
        printf("Escolheu %i e era %i\n", escolha, porta);

        //escolher porta para revelar
        if (porta != 0 && escolha != 0) { revelada = 0; }
        if (porta != 1 && escolha != 1) { revelada = 1; }
        if (porta != 2 && escolha != 2) { revelada = 2; }
        printf("Porta revelada: %i\n", revelada);

        //sempre trocar a porta
        if (revelada == 0) {
            if (escolha == 1) { escolha = 2; } else { escolha = 1; }
        } else if (revelada == 1) {
            if (escolha == 0) { escolha = 2; } else { escolha = 0; }
        } else {
            if (escolha == 0) { escolha = 1; } else { escolha = 0; }
        }
        printf("Porta trocada para %i\n", escolha);

        if (porta == escolha) {
            printf("Ganhou!\n\n");
            vitorias++;
        } else {
            printf("Perdeu!\n\n");
        }
    }
    printf("\nGanhou %i e perdeu %i. Proporcao %i%%", vitorias, TOTAL-vitorias, vitorias*100/TOTAL);
    return 0;
}

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.