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.
- Na primeira etapa o concorrente escolhe uma porta (que ainda não é aberta),
na esperança de escolher aquela com o carro;
- A seguir, Silvio Santos, que sabe o que está atrás de cada porta,
abre uma das outras duas portas que o concorrente não escolheu,
atrás da qual sempre haverá um bode;
- Silvio então perguntará ao concorrente se ele deseja manter a escolha da porta (feita no início do jogo), ou se deseja trocar pela outra porta que se encontra fechada.
- O concorrente decide se quer trocar de porta ou não, e o jogo termina com o concorrente ganhando um carro ou um bode.
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:
- O sorteio: o programa escolhe, sem mostrar ao usuário, a porta atrás da qual será colocado o carro.
- Primeira escolha: o usuário escolhe a porta onde ele espera encontrar o carro.
- Abertura de uma porta: o programa indica uma porta, diferente da escolhida pelo usuário, atrás da qual se encontra um bode.
- Segunda escolha: o usuário escolhe mudar ou não de porta.
- Final: o programa declara o prêmio ganho pelo usuário: um carro ou um bode.
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:
- Para o programa escolher a porta do bode, ele deve considerar dois casos.
No primeiro caso, a escolha do usuário é de uma porta com um bode.
Com isso, a escolha de outra porta com bode é única. No segundo caso, a escolha do usuário é da porta com o carro. Nesse caso, sobram duas portas com bodes. A escolha de qual das portas deverá ser aberta e mostrada ao usuário deverá ser feita através de sorteio.
- O seu programa deverá finalizar depois de executar uma e somente uma
simulação do jogo.
- As únicas construções (comandos, funções, etc) da linguagem C que você poderá usar em seu programa são as constantes deste enunciado e as dadas em aula.
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:
- Leitura dos dados: O novo programa deve solicitar o número total de
simulações do jogo que serão realizadas
(ex: 10000), e também para qual das opções
o usuário deseja estimar a probabilidade de ganhar o carro:
Porta escolhida inicialmente ou mudar de porta.
- Durante cada simulação do jogo:
- A primeira escolha do participante entre as 3 portas fechadas deve ser feita
aleatoriamente por sorteio.
- A segunda escolha do participante (se escolhe mudar ou não de porta)
será sempre a mesma lida no início do programa.
- Final: Após a execução de todas as
simulações, o programa deve imprimir o percentual de
vitórias (número de vezes que ganhou o carro dividido
pelo total de simulações).
Observações:
- Utilize o código da primeira tarefa como base,
fazendo apenas as modificações necessárias.
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:
- A primeira tarefa deve ser entregue em um arquivo com nome tarefa01.c
e a segunda parte em um arquivo tarefa02.c
- Certifique-se de que os seus programas foram realmente depositados no site do PACA.
Para sua maior segurança, imprima a página de confirmação
de entrega.
-
Os arquivos de código devem ter um cabeçalho de comentário com o seguinte formato:
/***************************************************************
** **
** Fulano de Tal (é o nome do aluno) Número USP **
** **
***************************************************************/
[Seu programa]