[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Problema 1 aula
Bem, eu estive pensando sobre aquele probleminha da primeira aula, e
fiz um pequeno programinha em C pra tentar elucidar as perguntas
efetuadas.
Assim, descobri que o segundo jogador, tem sempre chance maior que
50% de ganhar do primeiro jogador se escolher a estratégia adequada. (Na
verdade, quando a sequência se restringir a três (tipo HHH, HTH, etc),
essa chance varia de 2/3 até 7/8)
A estratégia seria a seguinte:
Supondo que o jogador 1 escolha a sequência HTH
Deve-se pegar os dois primeiros caracteres (HT), para formar os
últimos caracteres da sequência, e pegar o último caracter dessa
sequência escolhida, (no caso T), e invertê-lo (viraria um H) para
coloca-lo como primeiro caracter da sequência, que ficaria HHT. Sempre
que esse procedimento for efetuado, a chance de vitória é maior que 50%.
A primeira parte desse raciocínio, deve-se ao fato de que quando vc
escolhe os primeiros caracteres para formar os seus últimos, vc aumenta
a chance da segunda sequência se completar antes que a primeira se
complete. Assim, já há uma chance maior. Mas quanto a segunda parte,
ainda não consegui decifrar o porquê.
Acho que talvez a solução possa ser encontrada via teoria dos grafos,
mas ainda não testei e nem fiz um programa com essa finalidade, portanto
se alguém achar outro meio de explicar isso, ou se alguém fizer isso via
teoria dos grafos, mande o mail pra lista :)
Abaixo, divulgo o programa em C que utilizei para os testes.
Recomendo que depois de compilado, utilize-se a opção >arquivo.txt para
reter a saida em um arquivo, se estiverem fazendo isso via DOS. O
programa foi escrito em C para DJGPP, e está mal documentado acima de
tudo, pois só tinha utilidade para teste. Se alguém quiser compilá-lo em
Linux, remova a linha: "#include <conio.h>" e a linha "clrscr();",
certo?
Bem, então aqui vai ele:
======================================================
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
/* Este programa tem por objetivo testar as probabilidades de vitoria
quando certa sequencia e dada como entrada. Esta programada para 3
*/
unsigned char padp1,padc1,padj1;
unsigned char padp2,padc2,padj2;
unsigned char padp3,padc3,padj3;
unsigned char temp2,temp3,comppad;
unsigned int jog,temp,vitp,vitc;
float perc1,perc2;
/* Sendo que padpN = padrao da pessoa para a posicao N
padcN = padrao do computador para a posicao N
padjN = padrao do jogo para a posicao N
*/
void jogamoeda()
{
padj1=padj2;
padj2=padj3;
padj3=rand()%2;
}
void iniciajogo()
{
jogamoeda();
jogamoeda();
}
unsigned char verificavencedor()
{
if ((padj1==padp1)&(padj2==padp2)&(padj3==padp3))
{
vitp=vitp+1;
return 1;
}
if ((padj1==padc1)&(padj2==padc2)&(padj3==padc3))
{
vitc=vitc+1;
return 1;
}
return 0;
}
void setacomputerpadrao(unsigned char pad)
{
if (pad==0){padc1=0;padc2=0;padc3=0;}
if (pad==1){padc1=0;padc2=0;padc3=1;}
if (pad==2){padc1=0;padc2=1;padc3=0;}
if (pad==3){padc1=0;padc2=1;padc3=1;}
if (pad==4){padc1=1;padc2=0;padc3=0;}
if (pad==5){padc1=1;padc2=0;padc3=1;}
if (pad==6){padc1=1;padc2=1;padc3=0;}
if (pad==7){padc1=1;padc2=1;padc3=1;}
/* OBS: Poderia ter feito pelo modulo da divisao, ja que este esquema
nao passa do binario convensional, mas como estava meio com pressa...
*/
}
void setaplayerpadrao(unsigned char pad)
{
if (pad==0){padp1=0;padp2=0;padp3=0;}
if (pad==1){padp1=0;padp2=0;padp3=1;}
if (pad==2){padp1=0;padp2=1;padp3=0;}
if (pad==3){padp1=0;padp2=1;padp3=1;}
if (pad==4){padp1=1;padp2=0;padp3=0;}
if (pad==5){padp1=1;padp2=0;padp3=1;}
if (pad==6){padp1=1;padp2=1;padp3=0;}
if (pad==7){padp1=1;padp2=1;padp3=1;}
/* OBS: Poderia ter feito pelo modulo da divisao, ja que este esquema
nao passa do binario convensional, mas como estava meio com pressa...
*/
}
char* peg(unsigned char pad)
{
if (pad==0){return "000";}
if (pad==1){return "001";}
if (pad==2){return "010";}
if (pad==3){return "011";}
if (pad==4){return "100";}
if (pad==5){return "101";}
if (pad==6){return "110";}
if (pad==7){return "111";}
}
int main()
{
clrscr();
srand(time(0));
vitc=0;
vitp=0;
printf("Bem vindo ao teste de probabilidade do jogo Head
Tail\n");
printf("Digite quantas jogadas testes voce deseja realizar: ");
scanf("%d",&jog);
for (temp3=0;temp3<=7;temp3++)
{
setaplayerpadrao(temp3);
printf("\nPadrao escolhido: %d, %d, %d\n",padp1,padp2,padp3);
printf("\nComputando os dados e gerando a tabela de
respostas\n");
for (temp2=0;temp2<=7;temp2++)
{
setacomputerpadrao(temp2);
vitc=0;vitp=0;
for (temp=1;temp<=jog;temp++)
{
iniciajogo();
comppad=0;
while (comppad==0)
{
jogamoeda();
if (verificavencedor()==1){comppad=1;}
}
}
perc1=(float)vitp/(float)jog*100;
perc2=(float)vitc/(float)jog*100;
printf("Padrao: %s Vitorias: %d (%f) Derrotas: %d (%f)
\n",peg(temp2),vitc,perc2,vitp,perc1);
}
}
return 0;
}
==========================================================
Bem, não se sintam "desesperados" se não entenderem a princípio o
programa, isso é normal. Tem muitas coisas que podem parecer estranhas.
Se houver qualquer tipo de dúvida, ou sugestões, escrevam.
André G. Andrade.