Probabilité gagner au morpion (hasard)

Réponses à toutes vos questions de la 2nde à la Terminale toutes séries
beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 01 Juin 2012, 14:52

Iroh a écrit:Bizarre, j'obtiens des proba de victoire très proches pour les deux joueurs:

Tx: 0.873190, j1: 0.585820, j2: 0.574740

Principe:
- on fixe un nombre n de jeux consécutifs.
- on tire au sort celui qui joue le premier jeu, ensuite les joueurs jouent les n jeux en commençant chacun à leur tour.
- chaque joueur met son symbole dans la grille à un case libre au hasard.

Erreur de code peut-être.


si tu les fais jouer chacun leur tour en premier, ils auront les mèmes gains,
mais ce qui m'intéresse Iroh ce sont les % gain de premier joueur, % gain joueur en second,
dans ta simule laisse les joueurs à leur place.

les deux joueurs sont à 58% en alternant première et seconde place?, ça parait beaucoup comme moyenne non?
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.



beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 01 Juin 2012, 14:54

tu n'es pas en contradiction dans ta modif de texte,
tu dis que tu fixes premier et second joueur,
et dans le code tu dis on alterne????
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 01 Juin 2012, 14:55

beagle a écrit:si tu les fais jouer chacun leur tour en premier, ils auront les mèmes gains,
mais ce qui m'intéresse Iroh ce sont les % gain de premier joueur, % gain joueur en second,
dans ta simule laisse les joueurs à leur place.

les deux joueurs sont à 58% en alternant première et seconde place?, ça parait beaucoup comme moyenne non?


Non désolé ce n'était pas clair sur j1 et j2, j'ai fait un edit: j1: proba de gagner si on commence la partie, j2 = proba de gagner si on ne commence pas la partie de morpion.

beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 01 Juin 2012, 14:57

tu te sers de ceci ou non:
"Principe:
- on fixe ...
- on tire au sort celui qui joue le premier jeu, ensuite les joueurs jouent les n jeux en commençant chacun à leur tour.
-chaque joueur...
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 01 Juin 2012, 15:00

beagle a écrit:tu n'es pas en contradiction dans ta modif de texte,
tu dis que tu fixes premier et second joueur,
et dans le code tu dis on alterne????


Non, c'est juste que j'ai nommé de la même manière deux choses:

1) Joueur1 et Joueur2 sont les joueurs qui vont s'affronter durant N parties de morpions. On choisit au hasard celui qui commence la première, puis ils joueront l'un après l'autre les N-1 autres parties.

2) J1 et J2 correspond respectivement au joueur qui commence chaque partie de morpion et le joueur qui ne la commence pas. Donc tout au long des parties Joueur1 sera J1 (ou J2 ça dépend du point 1)), puis J2, puis J1, etc. Idem pour Joueur2.

beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 01 Juin 2012, 15:28

Je ne comprends pas bien pourquoi la moyenne n'est pas 0,873 divisée par deux,
comment peut-on faire du 58%?
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Juin 2012, 18:54

Bonsoir Beagle,
Tu relances le calcul, mais tu ne montres pas tes résultats ???
Moi, je trouve sur 5 fois 10000 jeux
58.5 % gagné pour le joueur 1 et 28.8 % gagné pour le joueur 2.
Le joueur 1 a l'énorme avantage d'avoir 1 coup d'avance. Donc, s'il gagne avec ses 3 premières croix, le joueur 2 n'aura même pas eu le temps de mettre son troisième petit rond.
Exemple sur les 10 premiers coups.
Code: Tout sélectionner
J1 :  1 2     5 6 7      ... J1G=0
J2 :      3 4       8 9  ... J2G=0

J1 :  1   3         8 9  ... J1G=0
J2 :        4 5 6 7      ... J2G=1

J1 :  1 2 3              ... J1G=1
J2 :              7 8    ... J2G=1

J1 :    2 3   5   7   9  ... J1G=2
J2 :  1     4   6   8    ... J2G=1

J1 :  1   3   5 6   8    ... J1G=2
J2 :    2   4     7   9  ... J2G=1

J1 :      3   5   7      ... J1G=3
J2 :            6   8    ... J2G=1

J1 :              7 8 9  ... J1G=4
J2 :    2   4            ... J2G=1

J1 :    2       6     9  ... J1G=4
J2 :  1     4     7      ... J2G=2

J1 :    2     5 6 7   9  ... J1G=4
J2 :  1   3 4       8    ... J2G=2

J1 :    2   4 5 6        ... J1G=5
J2 :  1           7 8    ... J2G=2


A noter que j'ai calculé de façon que J1 joue toujours en premier. Donc mes résultats ne sont pas contradictoires avec ceux d'Iroh.

beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 01 Juin 2012, 19:28

Dlzlogic a écrit:Bonsoir Beagle,
Tu relances le calcul, mais tu ne montres pas tes résultats ???
Moi, je trouve sur 5 fois 10000 jeux
58.5 % gagné pour le joueur 1 et 28.8 % gagné pour le joueur 2.
Le joueur 1 a l'énorme avantage d'avoir 1 coup d'avance. Donc, s'il gagne avec ses 3 premières croix, le joueur 2 n'aura même pas eu le temps de mettre son troisième petit rond.
Exemple sur les 10 premiers coups.
Code: Tout sélectionner
J1 :  1 2     5 6 7      ... J1G=0
J2 :      3 4       8 9  ... J2G=0

J1 :  1   3         8 9  ... J1G=0
J2 :        4 5 6 7      ... J2G=1

J1 :  1 2 3              ... J1G=1
J2 :              7 8    ... J2G=1

J1 :    2 3   5   7   9  ... J1G=2
J2 :  1     4   6   8    ... J2G=1

J1 :  1   3   5 6   8    ... J1G=2
J2 :    2   4     7   9  ... J2G=1

J1 :      3   5   7      ... J1G=3
J2 :            6   8    ... J2G=1

J1 :              7 8 9  ... J1G=4
J2 :    2   4            ... J2G=1

J1 :    2       6     9  ... J1G=4
J2 :  1     4     7      ... J2G=2

J1 :    2     5 6 7   9  ... J1G=4
J2 :  1   3 4       8    ... J2G=2

J1 :    2   4 5 6        ... J1G=5
J2 :  1           7 8    ... J2G=2


A noter que j'ai calculé de façon que J1 joue toujours en premier. Donc mes résultats ne sont pas contradictoires avec ceux d'Iroh.


Génial, merci Dlzlogic,
58,5 et 28,8
je ne suis pas loin, j'ai quelques % à grapiller donc.
Mes résultats ce sera lorsque j'aurais bon.
Je suis en simulation de raisonnement!!!!
Pas en résultat expérimental.
Mais les simulations m'aident à raisonner, je sais c'est un peu tricher, mais bon ...
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 01 Juin 2012, 19:37

J'ai fait un erreur: la proba du joueur qui commence la partie est correcte, mais j'avais joint celle de l'autre avec le nombre d'égalités...

J'obtiens ça: Tx: 0.871910, j1: 0.584030, j2: 0.287880

code

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 01 Juin 2012, 20:31

Donc j'ai bon, il faut fêter ça. :ptdr:
Juste un petit détail, plus de 3 chiffres significatifs c'est un peu "dangereux" :zen:

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 01 Juin 2012, 21:10

Dlzlogic a écrit:Donc j'ai bon, il faut fêter ça. :ptdr:
Juste un petit détail, plus de 3 chiffres significatifs c'est un peu "dangereux" :zen:


Il n'est pas question de chiffres significatifs ici vu qu'on fait juste une simulation informatique qui fait intervenir des nombres aléatoires. Sinon j'ai utilisé des float pour faire la moyenne (en simple précision donc je pense, si les float correspondent à ceux du compilateur gcc), donc on devra se contenter de cette précision si on manipule ces nombres.

Edit: en fait non c'est juste le format printf '%f' qui par défaut affiche 10 chiffres après la virgule. Sinon, vu que j'ai fait 100K jeux et que j1 vaut 873190, la moyenne vaut bien 873190/100000. Ici les chiffres significatifs n'ont pas lieu d'être: on n'est pas en physique où l'on a récolté des données à l'aide d'instruments d'une certaine précision, et où l'on ne peut être sûr qu'un d'un certain nombre de chiffres significatifs, les autres n'étant pas pertinent.

On a aussi manipulé que des nombres entiers, c'est juste lors du calcul de la moyenne qu'on utilise des nombres à virgules flottantes, donc il n'y a pas au cours du programme d'erreurs d'arrondis qu'on aurait pu (ou pas, en fonction de la stabilité de l'algorithme) bornés, afin d'avoir des chiffres significatifs (càd pertinents, et non «du bruit»)

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 01 Juin 2012, 23:04

Bonsoir, j'ai demandé à Matlab de calculer les probas exactes, j'obtiens des résultats cohérents avec vos simulations et le calcul fait plus tôt qui donnait 55/63 pour la probabilité qu'il y ait un gagnant :

Probabilité que le joueur qui joue en premier gagne : 737/1260 soit environ 58,5%
Probabilité que le joueur qui joue en second gagne : 121/420 soit environ 28,8%
Probabilité de match nul : 8/63 soit environ 12,7%

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 02 Juin 2012, 09:00

Skullkid a écrit:Bonsoir, j'ai demandé à Matlab de calculer les probas exactes, j'obtiens des résultats cohérents avec vos simulations et le calcul fait plus tôt qui donnait 55/63 pour la probabilité qu'il y ait un gagnant :

Probabilité que le joueur qui joue en premier gagne : 737/1260 soit environ 58,5%
Probabilité que le joueur qui joue en second gagne : 121/420 soit environ 28,8%
Probabilité de match nul : 8/63 soit environ 12,7%

Salut, peux-tu montrer comment tu as fait pour avoir ces résultats en matlab stp ?

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 02 Juin 2012, 10:11

Bonjour,
J'ai évoqué le nombre de chiffres significatifs, au vu de mes résultats.
J'ai noté 5 parties de 10000 jeux, et j'ai obtenu des scores J1 entre 5808 et 5882 J2 entre 2832 et 2904.
Donc, le troisième chiffre est à peu près juste le quatrième ne signifie rien avec le nombre de tirages que j'ai faits.

beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 02 Juin 2012, 12:27

Merci Skullkid, c'est plus facile connaissant le résultat.
J'ai donc en démonstration le 121/420 du joueur en second.
Pour le joueur en premier je suis assez proche et j'ai repéré une erreur, à voir si après correction de seulement celle-ci je tombe juste!
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.

nodjim
Membre Complexe
Messages: 3241
Enregistré le: 24 Avr 2009, 16:35

par nodjim » 02 Juin 2012, 13:24

En numérotant les cases:
123
456
789

Je dénombre 16 combinaisons perdantes:
3489,3459,3458,2679,2579,2567,2479,2459,2349,1678,1568,1567,1368,1358,1348,1267.
sur les 126 possibles.

Ce qui arriverait à un taux de gain de 0.873.
Les 16 combis se groupent en 3 classes de dessin, chaque élément d'une classe donnée se déduisant par symétrie/rotation.

beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 02 Juin 2012, 16:15

C'est OK pour premier joueur à 737/1260 maintenant, il y avait plusieurs retouches à faire!
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.

beagle
Habitué(e)
Messages: 8746
Enregistré le: 08 Sep 2009, 14:14

par beagle » 02 Juin 2012, 16:28

J'ai reposé la question probas des joueurs sur le forum défi.
C'est un peu dommage vu la fréquention de la section lycée d'enterrer cela ici!
L'important est de savoir quoi faire lorsqu'il n' y a rien à faire.

Skullkid
Habitué(e)
Messages: 3075
Enregistré le: 08 Aoû 2007, 19:08

par Skullkid » 02 Juin 2012, 17:06

Iroh a écrit:Salut, peux-tu montrer comment tu as fait pour avoir ces résultats en matlab stp ?


Voilà le code principal :

Code: Tout sélectionner
victoire1 = 0;
victoire2 = 0;
combgagn = zeros(8,3);
combgagn(1,:) = [1,2,3];
combgagn(2,:) = [4,5,6];
combgagn(3,:) = [7,8,9];
combgagn(4,:) = [1,4,7];
combgagn(5,:) = [2,5,8];
combgagn(6,:) = [3,6,9];
combgagn(7,:) = [1,5,9];
combgagn(8,:) = [3,5,7];

for i = 1:1:362880
    grille = grilles(i,:);
    joueur1 = [grille(1),grille(3),grille(5),grille(7),grille(9)];
    joueur2 = [grille(2),grille(4),grille(6),grille(8)];
    ind1 = 10;
    ind2 = 10;
    for j = 1:1:8
       [flag1,temp1] = Inclus(combgagn(j,:),joueur1);
       [flag2,temp2] = Inclus(combgagn(j,:),joueur2);
       if flag1 == true
          ind1 = min(ind1,2*temp1-1);
       end
       if flag2 == true
          ind2 = min(ind2,2*temp2);
       end
    end
    if ind1 < ind2
        victoire1 = victoire1 + 1;
    elseif ind2 < ind1
        victoire2 = victoire2 + 1;
    end
end


grilles est un tableau 9!*9 qui contient toutes les permutations de |[1,9]| (que j'ai construit séparément), c'est-à-dire toutes les parties possibles en supposant que les joueurs continuent à remplir la grille même s'il y a déjà un vainqueur, de sorte que toutes les parties jouées de cette manière deviennent équiprobables.

La fonction Inclus(L,M) renvoie un couple [booléen,index] où le booléen vaut "true" si et seulement si l'ensemble des éléments de la liste L est inclus dans l'ensemble des éléments de la liste M, et index est l'indice dans M de l'élément de L qui apparaît en dernier dans M (index vaut 0 si L n'est pas incluse dans M). Par exemple Inclus([1,2,3],[3,5,4,1,8,2,6]) renvoie [true,5].

Sur les 362880 parties possibles, 212256 sont remportées par le joueur qui commence, 104544 par l'autre joueur, et 46080 sont nulles, ce qui donne les probas que j'ai écrites plus haut.

@beagle : t'as réussi à prouver à la main les 121/420 et 737/1260 ? Comment as-tu fait ?

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 02 Juin 2012, 17:30

Voici le mien :
Code: Tout sélectionner
int main()
{
  FILE *ecr=fopen("Morpion.txt","wt");
  randomize();
  int J1[9];
  int J2[9];
  int J1G=0;
  int J2G=0;
  int Tab[8][4];
  Tab[0][1]=1; Tab[0][2]=2; Tab[0][3]=3;
  Tab[1][1]=4; Tab[1][2]=5; Tab[1][3]=6;
  Tab[2][1]=7; Tab[2][2]=8; Tab[2][3]=9;
  Tab[3][1]=1; Tab[3][2]=4; Tab[3][3]=7;
  Tab[4][1]=2; Tab[4][2]=5; Tab[4][3]=8;
  Tab[5][1]=3; Tab[5][2]=6; Tab[5][3]=9;
  Tab[6][1]=1; Tab[6][2]=5; Tab[6][3]=9;
  Tab[7][1]=3; Tab[7][2]=5; Tab[7][3]=7;
  for (int fois=0; fois<10000; fois++)
  {
    for (int i=0; i<9; i++)
    {
      J1[i]=-1;
      J2[i]=-1;
    }
    bool Fini=false;
    for (int n=0; n<5; n++)
    {
      bool jeu=false;
      do
      {
        int x=rand()%9;
        if (J1[x] == -1 && J2[x] == -1)
        {
          jeu=true;
          J1[x] = 1;
          for (int j=0; j<8; j++)
          {
            if (J1[Tab[j][1]-1] == 1 && J1[Tab[j][2]-1] == 1 && J1[Tab[j][3]-1] == 1)
            {
              J1G++;
              Fini=true;
              break;
            }
          }
        }
      }while (!jeu);
      if (n == 4) break;
      if (Fini) break;

      jeu=false;
      do
      {
        int o=rand()%9;
        if (J1[o] == -1 && J2[o] == -1)
        {
          jeu=true;
          J2[o] = 1;
          for (int j=0; j<8; j++)
          {
            if (J2[Tab[j][1]-1] == 1 && J2[Tab[j][2]-1] == 1 && J2[Tab[j][3]-1] == 1)
            {
              J2G++;
              Fini=true;
              break;
            }
          }
        }
      }while (!jeu);
      if (Fini) break;
    }
  }
  printf("Joueur 1 %d  joueur 2 %d \n",J1G,J2G);
  fprintf(ecr,"Joueur 1 %d  joueur 2 %d \n",J1G,J2G);
  fclose(ecr);

  system("pause");
  return 0;
}

Il est basé sur le hasard : utilisation de la fonction rand().
Je crois qu'il n'y a pas grand-chose à expliquer, le joueur 1 et le joueur 2 jouent au hasard successivement, après chaque coup, on regarde le joueur a l'une des 8 positions gagnantes.
En fait il n'y a aucuns astuce particulière, même pas de recherche d'optimisation. (C'est du C)

 

Retourner vers ✎✎ Lycée

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 25 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite