Introdução

O problema de Monty Hall, também conhecido por paradoxo de Monty Hall é um problema matemático e paradoxo que surgiu a partir de um show de auditório televisivo dos Estados Unidos chamado Let's Make a Deal, exibido na década de 1970. No Brasil ficou conhecido como Problema do Silvio Santos.

O jogo consiste no seguinte: Silvio Santos (o apresentador) apresentava 3 portas fechadas ao concorrente, sabendo que atrás de uma delas está um carro (prémio bom) e que as outras têm prêmios de pouco valor, como por exemplo, bodes.

Qual é a estratégia mais lógica? Ficar com a porta escolhida inicialmente ou mudar de porta? Com qual das duas portas ainda fechadas o concorrente tem mais probabilidade de ganhar? Por quê?

Tarefa 01:

Este exercício-programa consiste de duas etapas. Na primeira, a sua tarefa será escrever um programa em linguagem C para simular uma rodada do jogo descrito acima. O seu programa deverá desempenhar o papel do Silvio Santos enquanto o usuário do programa desempenhará o papel do concorrente. O seu programa deverá implementar os seguintes passos: Para realizar os sorteios, você deve incluir algumas bibliotecas adicionais e chamar no início do código a função srand, seguindo o esqueleto de código abaixo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
  /*Colocar aqui a declaração das variáveis*/

  srand(time(NULL));

  /*Colocar aqui o seu código*/

  return 0;
}
  
As primeiras linhas incluem as bibliotecas necessárias para uso em seu programa. A seguir, o gerador de números pseudo-aleatórios é inicializado com o valor do tempo do relógio do computador através da chamada da função srand(time(NULL));. Para informações mais detalhadas sobre números pseudo-aleatórios, clique aqui.

A função que gera números aleatórios em C é a rand(). Ela gera números entre 0 e RAND_MAX, que é uma constante definida em stdlib.h. Para fazer um sorteio dentro de uma faixa de valores diferente podemos usar operações matemáticas, como o operador de resto da divisão: %.
Por exemplo, para fazer com que uma variável 'x' receba um valor entre 0 e 9, fazemos:

x = rand() % 10;

Para fazer com que 'x' receba um valor entre 1 e 10, fazemos:
x = 1 + ( rand() % 10 );

Observações:

Exemplos de partidas:

Nos exemplos, tudo que aparece em vermelho foi digitado pelo usuário.

Exemplo 1:

Problema das portas do Silvio Santos.
Escolha a porta onde esta o carro (1-3): 2
Silvio mostra que a porta 3 tem um bode.
Quer mudar de porta? (sim=1/nao=0): 1
Parabens, voce ganhou um carro!
Exemplo 2:
Problema das portas do Silvio Santos.
Escolha a porta onde esta o carro (1-3): 1
Silvio mostra que a porta 2 tem um bode.
Quer mudar de porta? (sim=1/nao=0): 0
Parabens, voce ganhou um bode!

Tarefa 02:

O objetivo dessa segunda etapa é realizar várias simulações do jogo, fazendo uma análise empírica da probabilidade de ganhar o carro para cada uma das respostas, de modo a responder a pergunta: "Com qual das duas portas ainda fechadas o concorrente tem mais probabilidade de ganhar?"

O seu programa deverá implementar os seguintes passos:

Observações:

Exemplo de execução:

No exemplo, tudo que aparece em vermelho foi digitado pelo usuário.

Problema das portas do Silvio Santos.
Numero de iteracoes da simulacao: 10000
Quer mudar de porta? (sim=1/nao=0): 0
Ganhou o carro em 33.36% das vezes.

INFORMAÇÕES SOBRE ENTREGA: