[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.