Question 1

On commence par créer une fonction qui génère un lancer avec la répartition fréquentielle donnée en argument. La somme des trois arguments doit être égale à 1.

unLancer=function(Pp, Pf, Pc){
  tirage=runif(1)
  if(tirage <= Pp){
    "P"
  } else if(tirage > Pp && tirage <= Pf+Pp){
    "F"
  } else if(tirage > Pf+Pp){
    "C"
  }
}

On écrit ensuite une fonction qui simule une manche entre deux joueurs. Elle prend en paramètres J1 et J2 qui sont des tableaux de 4 cases, respectivement leur score et la probabilité de sortir un des coups pierre, feuille ou ciseaux, dans cet ordre. Elle renvoie un tableau de deux cases contenant les points à ajouter au score du J1 et du J2 respectivement.

uneManche=function(J1,J2){
  return = c()
  resultJ1=unLancer(J1[2],J1[3],J1[4])
  resultJ2=unLancer(J2[2],J2[3],J2[4])
  if(resultJ1 == "P"){
    if(resultJ2 == "P"){
      return = c(0,0)
    } else if(resultJ2 == "F"){
      return = c(-1,1)
    } else if(resultJ2 == "C"){
      return = c(1,-1)
    }
  } else if(resultJ1 == "F"){
    if(resultJ2 == "P"){
      return = c(1,-1)
    } else if(resultJ2 == "F"){
      return = c(0,0)
    } else if(resultJ2 == "C"){
      return = c(-1,1)
    }
  } else if(resultJ1 == "C"){
    if(resultJ2 == "P"){
      return = c(-1,1)
    } else if(resultJ2 == "F"){
      return = c(1,-1)
    } else if(resultJ2 == "C"){
      return = c(0,0)
    }
  }
  return
}

On peut maintenant créer une fonction qui repète N manches en mettant à jour les scores de nos deux joueurs. Elle prend en paramètre deux tableaux de trois cases contenant les probabilités de faire pierre, feuille ou ciseaux dans cet ordre, pour chacun des joueurs. Elle renvoie un tableau de 5 cases qui correspondent au score du J1, au score du J2, à la probabilité estimée de victoire du J1, à la probabilité estimée de victoire du J2, et à la probabilité estimée de match nul.

jeu=function(ProbaJ1, ProbaJ2,N){
  J1 = c(0,ProbaJ1)
  J2 = c(0,ProbaJ2)
  nbWinJ1 = 0
  nbWinJ2 = 0
  for (i in 1:N){
    resManche=uneManche(J1,J2)
    J1[1] = J1[1] + resManche[1]
    if(resManche[1] == 1){
      nbWinJ1 = nbWinJ1 + 1
    }
    J2[1] = J2[1] + resManche[2]
    if(resManche[2] == 1){
      nbWinJ2 = nbWinJ2 + 1
    }
  }
  probaWinJ1 = nbWinJ1/N
  probaWinJ2 = nbWinJ2/N
  probaMatchNul = 1-probaWinJ1-probaWinJ2
  c(J1[1],J2[1],probaWinJ1,probaWinJ2,probaMatchNul)
}

On lance maintenant la simulation avec les paramètres de la question 1-1

ProbaJ1 = c(1/4,1/4,1/2)
ProbaJ2 = c(1/4,1/4,1/2)
N = 10000
resultatJeu=jeu(ProbaJ1,ProbaJ2,N)
EsperanceGainJ2 = resultatJeu[4] - resultatJeu[3]
"Esperance de gain du J2 dans le cas ProbaJ1 = 1/4 1/4 1/2"
## [1] "Esperance de gain du J2 dans le cas ProbaJ1 = 1/4 1/4 1/2"
EsperanceGainJ2
## [1] 0.0097
EsperanceGainJ2 = c();
for(i in 1:100){
  resultatJeu=jeu(ProbaJ1,ProbaJ2,100)
  EsperanceGainJ2[i] = resultatJeu[4] - resultatJeu[3]
}
plot(EsperanceGainJ2, main = "Esperances de gain de J2(biaisé) sur plusieurs parties dans le cas 1-1");
abline(h = mean(EsperanceGainJ2),col="red");

On estime donc l’espérance à 0.

On relance la simulation avec les paramètres de la question 1-2.

ProbaJ1 = c(1/4,1/4,1/2)
ProbaJ2 = c(1/3,1/3,1/3)
N = 10000
resultatJeu=jeu(ProbaJ1,ProbaJ2,N)
EsperanceGainJ2 = resultatJeu[4] - resultatJeu[3]
"Esperance de gain du J2 dans le cas ProbaJ1 = 1/3 1/3 1/3"
## [1] "Esperance de gain du J2 dans le cas ProbaJ1 = 1/3 1/3 1/3"
EsperanceGainJ2
## [1] 0.0016
EsperanceGainJ2 = c();
for(i in 1:100){
  resultatJeu=jeu(ProbaJ1,ProbaJ2,100)
  EsperanceGainJ2[i] = resultatJeu[4] - resultatJeu[3]
}
plot(EsperanceGainJ2, main = "Esperances de gain de J2(non biaisé)\nsur plusieurs parties dans le cas 1-2");
abline(h = mean(EsperanceGainJ2),col="red");

On estime l’espérance à 0 ici aussi.

On fait maintenant varier les paramètres initiaux du joueur 2 comme l’indique la question 1-3.

N = 1000
esperances = c()
for(pierre in 0:10/10){
  for(feuille in 0:10/10){
    ProbaJ2 = c(pierre,feuille,1-pierre-feuille)
    resultatJeu=jeu(ProbaJ1,ProbaJ2,N)
    esperances = c(esperances,resultatJeu[4] - resultatJeu[3])
  }
}
plot(esperances, main = "Esperances de gain de J2(non biaisé)\nlors des variations de x et y")

Dans ce graphe, on affiche l’espérance en fonction des itérations de notre boucle. Il y a 11 itérations de pierre et 11 itération de feuille par itérations de pierre. On remarque donc 11 motifs décroissants se répéter et se ressérer vers la fin, avec une tendance croissante. On peut déduire des motifs que les espérances sont moins bonnes si on joue trop la feuille. On peux aussi déduire que les espérances sont meilleures si on joue plus souvent la pierre, vu que plus on avance dans les itérations de pierre plus elles sont bonnes. Pour maximiser son espérance, il faut donc souvent opter pour la pierre, ce qui parait logique car dans cette configuration, le joueur A fait les ciseaux une fois sur deux.

Pour répondre à la question 1-5, optons pour une approche mathématique du problème. On peut représenter la situation sous la forme d’un arbre de probabilités. Avec cette représentation, on obtient la formule suivante pour la probabilité de victoire du joueur 2.

\(P(Player2Win) = P(P_a \cap F_b) + P(F_a \cap C_b) + P(C_a \cap P_b)\) \(= P(P_a) * P(F_b|P_a) + P(F_a) * P(C_b|F_a) + P(C_a) * P(P_b|C_a)\) \(= P(P_a) * P(F_b) + P(F_a) * P(C_b) + P(C_a) * (P_b)\) car indépendance de Xa et Xb.

Avec le même type de formule, en adaptant les règles, on trouve P(Player2Lose). On se sert de ces deux probabilités pour calculer l’espérance.

\(EsperanceGainJ2 = (gain possible) * P(Player2Win) - (wager) * P(Player2Lose)\) \(= P(Player2Win) - P(Player2Lose)\) \(= \frac{y}{4} + \frac{(1-x-y)}{4} + \frac{x}{2} - (\frac{(1-x-y)}{4} + \frac{x}{4} + \frac{y}{2})\) \(= (x-y)/2\)

On valide bien la conclusion ci-dessus avec ce resultat, pour maximiser l’espérance de gain, il faut maximiser la probabilité de jouer pierre (et minimiser la probabilité de jouer feuille).

On refait maintenant les expériences avec un joueur non-biaisé.

ProbaJ1 = c(1/3,1/3,1/3)
ProbaJ2 = c(1/4,1/4,1/2)
N = 10000
resultatJeu=jeu(ProbaJ1,ProbaJ2,N)
EsperanceGainJ2 = resultatJeu[4] - resultatJeu[3]
"Esperance de gain du J2 dans le cas ProbaJ1 = 1/4 1/4 1/2"
## [1] "Esperance de gain du J2 dans le cas ProbaJ1 = 1/4 1/4 1/2"
EsperanceGainJ2
## [1] 0.0017
EsperanceGainJ2 = c();
for(i in 1:100){
  resultatJeu=jeu(ProbaJ1,ProbaJ2,100)
  EsperanceGainJ2[i] = resultatJeu[4] - resultatJeu[3]
}
plot(EsperanceGainJ2, main = "Esperances de gain de J2(biaisé) sur plusieurs parties\ndans le cas du joueur non biaisé");
abline(h = mean(EsperanceGainJ2),col="red");