knitr::opts_chunk$set(echo = TRUE)
set.seed(34875)

Exercice 1: Question préliminaire à propos d’estimation

Question 1



On simule ici, l’expérience une première fois.


n=1000
a=sample(0:500,1,T)
a
## [1] 103
s=runif(n,0,a)
M=max(s)
M
## [1] 102.9568

On pourrait s’attendre à ce que l’espérance de M se rapproche de a si n est très supérieur à a. En effet, selon mon intuition, si l’on tire uniformément 100000 nombres compris entre 0 et 10, le max de ces 100000 nombres a logiquement plus de chance d’être très proche de a que si l’on avait tiré uniquement 2 nombres entre 0 et 10.


On modélise ici l’expérience. On choisit a, un entier compris entre 1 et 500 , et on trace la courbe des esperances de M en fonction de n, pour n allant de 2 à 1000.

esp=c()
for(i in 2:n){
  M=replicate(100, max(runif(i,0,a)))
  esp[i]=mean(M)
}
plot(esp, type="l", ylab = "Espérance de M", xlab = "Valeur de n")

On peut remarquer que pour toutes les valeurs de n, l’espérance de M est supérieure à \(\frac{a}{2}\). De plus, plus n est grand, plus E[M] tend vers a. On recherche donc une formule positive sur [2,n], croissante et qui quand n tend vers l’inifini, la fonction tend vers a. L’idéal serait donc d’avoir une formule telle que \(E[M]=a*X\) avec \(X<=1\) car \(E[M]<=a\) et \(\lim\limits_{n \rightarrow +\infty} X=1\).
L’allure de la courbe de l’espérance de M ressemble à la “symétrie” de la courbe \(\frac{1}{n}\):

plot((1/(2:n)), ylab = "1/n", xlab = "Valeur de n", type="l")

On peut donc regarder l’allure de la courbe \(a-\frac{1}{n}\):

plot((a-(1/(2:n))), ylab = "a - 1/n", xlab = "Valeur de n", type="l")

La courbe ressemble fortement à celle de l’espérance de M. Testons la formule avec quelques valeurs:

atest=100
ntest=10
atest-1/ntest
## [1] 99.9
M=replicate(100, max(runif(ntest,0,atest)))
mean(M)
## [1] 90.41076

Quand je fais varier les valeurs de a et n, j’ai l’impression que je peux trouver une formule plus précise car elle donne des valeurs supérieures à celles trouvées empiriquement. Je teste donc \(a-\frac{a}{n}=\frac{a*(n-1)}{n}\):

plot(a-(a/(2:n)), ylab = "a - a/n", xlab = "Valeur de n", type="l")

atest=100
ntest=2
atest*(ntest-1)/ntest
## [1] 50
M=replicate(100, max(runif(ntest,0,atest)))
mean(M)
## [1] 65.83889

Bien que l’allure de la courbe corresponde, pour des valeurs de n très inférieures à a, les résultats ne sont pas satisfaisants, ils sont trop faibles par rapport aux valeurs empiriques. Je teste donc \(E[X]=\frac{a*n}{n+1}\):

plot(a*(2:n)/((2:n)+1), ylab = "a*n/(n+1)", xlab = "Valeur de n", type="l")

atest=100
ntest=2000
atest*ntest/(ntest+1)
## [1] 99.95002
M=replicate(100, max(runif(ntest,0,atest)))
mean(M)
## [1] 99.9473

Cette fois-ci, la formule semble correcte.
Je pense donc que la formule de l’espérance est \(E[M]=\frac{a*n}{n+1}\)

J’avoue ne pas trop comprendre ce que vous entendez par “corriger” M afin que son espérance soit égale à a. À la vue de la formule que j’ai déduite pour l’espérance de M, je dirais qu’il faut prendre un n très grand afin que E[M] tende vers a (?), ou alors qu’il faut mettre \(M=\frac{a}{n} + max(Xi)\). En effet, grâce aux observations précédentes je constate que si \(2<n<a\), max(Xi) est assez “loin” de a, donc si on additionne M avec \(\frac{a}{n}\), cela permettrait à M de se “rapprocher” de M. De même, si \(n>a\), M se “rapproche” de a si on l’additionne avec \(\frac{a}{n}\). Cependant, avec cette formule de M, l’espérance de M sera quelque fois supérieure à a, ce qui est en théorie impossible.



On cherche maintenant à trouver la variance.

var=c()
for(i in 2:n){
  M=replicate(100, max(runif(i,0,a)))
  var[i]=mean(M**2)-mean(M)**2
}
plot(var, type="l", ylab = "Variance de M", xlab = "Valeur de n")

On sait que la formule de la variance de M est \(E[M²]-E[M]²\). On cherche donc une courbe dont la formule est \(E[M²] - (\frac{na}{n+1})²\) avec logiquement \(E[M²]>E[M]²\) car la variance est positive et \(E[M²]>E[M]\) car n et a sont strictement positifs. \(M=max(Xi)\) donc \(M²=max(Xi)²\), les valeurs possibles de M² sont donc dans l’intervalle \([0,a²]\). L’espérance de M² va tendre vers a², de la même manière que E[M] tend vers a quand n tend vers l’infinie. J’essaye donc la formule \(\frac{n*a²}{n+1}-E[M]²\)

plot((2:n)*a**2/((2:n)+1)-((2:n)*a/((2:n)+1))**2, type="l", ylab = "a²*n/(n+1) - E[M]²", xlab = "Valeur de n")

L’allure de la courbe correspond mais il reste à corriger les valeurs en ordonnées qui ne correspondent pas à celles trouvées sur le graphe de la variance, elles sont trop élevées. Cela signifie que \(E[M²]<\frac{n*a²}{n+1}\). J’essaye donc avec \(\frac{a²*n}{n+2} - E[M]²\):

plot((2:n)*a**2/((2:n)+2)-((2:n)*a/((2:n)+1))**2, type="l", ylab = "a²*n/(n+1) - E[M]²", xlab = "Valeur de n")

Le graphe correspond à celui de la variance, j’estime donc que la formule de la variance de M est \(var(M)=\frac{n*a²}{n+2}-(\frac{na}{n+1})²\).

Question 2



Je pense que l’espérance de M’ va tendre vers a quand n va tendre vers l’infini. En effet, \(\frac{\sum{Xi}}{n}\) représente la moyenne des valeurs possibles des Xi, donc si l’on prends un n très supérieur à a, \(\frac{\sum{Xi}}{n}\) sera proche de . Donc \(\lim\limits_{n \rightarrow +\infty} M'=a\) et \(\lim\limits_{n \rightarrow +\infty} E[M']=a\).

esp2=c()
for(i in 2:n){
  M2=replicate(100, (2/i)*sum(runif(i,0,a)))
  esp2[i]=mean(M2)
}
plot(esp2, type="l", ylab = "Espérance de M'", xlab = "Valeur de n")

On constate que l’espérance de M’ tend bien vers a quand n tend vers l’infini. Lorsque n est très inférieur à a, les valeurs de l’espérance sont très aléatoires dûes au faible nombre de tirage des Xi par rapport aux valeurs possibles des Xi. La courbe de l’espérance semble être encadrée par deux fonctions symétriques par rapport à la droite y=a.


Il est très facile de montrer que l’espérance de M’ tend vers a lorsque n tend vers l’infini:
\(E[M']=E[\frac{2*\sum{Xi}}{n}]=\frac{2*E[\sum{Xi}]}{n}=\frac{2*\sum{E[Xi]}}{n}=\frac{2*\sum{\frac{a}{2}}}{n}=\frac{2*\frac{n*a}{2}}{n}=a\)

var2=c()
for(i in 2:n){
  M2=replicate(100, (2/i)*sum(runif(i,0,a)))
  var2[i]=mean(M2**2)-mean(M2)**2
}
plot(var2, type="l", ylab = "Variance de M'", xlab = "Valeur de n")

On sait que la formule de la variance de M’ est \(E[M'²]-E[M']²\). On cherche donc \(E[M'²]\) car on sait que \(E[M']²=a²\). On sait que \(E[M'²]>E[M']²\) car la variance de M’ est positive, on sait aussi que \(E[M'²]>E[M']\) et que \(\lim\limits_{n \rightarrow +\infty} E(M'²)=a²\). On essaye donc \(\frac{(n+1)*a²}{n}-a²\).

plot((1+(2:n))*a**2/((2:n))-a**2, type="l", ylab = "a²*(n+1)/n - E[M]²", xlab = "Valeur de n")

La courbe a la bonne allure mais les valeurs en ordonnées sont trop élevées ce qui signifie que \(E[M'²]<\frac{(n+1)*a²}{n}\). Je teste alors la formule \(\frac{(n+2)*a²}{n+1}-a²\):

plot((2+(2:n))*a**2/((2:n)+1)-a**2, type="l", ylab = "a²*(n+2)/(n+1) - E[M]²", xlab = "Valeur de n")

Les ordonnées sont toujours trop grandes donc \(E[M'²]<\frac{(n+2)*a²}{n+1}\). Après plusieurs autres tests, j’essaye avec \(\frac{(n+5)*a²}{n+4}-a²\):

plot((5+(2:n))*a**2/((2:n)+4)-a**2, type="l", ylab = "a²*(n+5)/(n+4) - E[M]²", xlab = "Valeur de n")

La courbe ressemble à celle trouvée empiriquement, la formule de la variance de M’ est donc à peu près égale à \(\frac{(n+5)*a²}{n+4}-a²\).


La variance de M’ a des valeurs plus élevées que celle de M pour des n inférieurs à a. C’est donc un moins bon estimateur que M.

Exercice 2: Un deuxième jeu à base de max

Question 3

À la vue des observations faites dans l’exercice 1, on sait que plus n est supérieur à a, plus on a de chance que M soit proche de a. Dans le jeu de Bob et Alice, en répondant \(r(M)=1.1*M\), Bob estime que a est supérieur ou égal à M + 10%. Cela ne me semble pas déraisonnable pour n=10. Par contre si n était très très grand, je n’aurai pas pensé que ce soit une bonne stratégie. Je pense cependant que Bob pourrait être un peu plus “joueur”, et donner une réponse plus élevée que \(1.1*M\) étant donné que n est assez petit.

A=runif(1,0,1)
A
## [1] 0.7441808
n=10
M=replicate(100,max(runif(n,0,A)))
G=c()
for (i in 1:100){
  if(1.1*M[i]>A){
    G[i]=0
  }else{
    G[i]=1.1*M[i]-M[i]
  }
}

espG=mean(G)
espG
## [1] 0.0209947

L’espérance est supérieure à 0, donc Bob est gagnant mais elle est tellement faible, qu’il faut peut-être qu’il revoit sa stratégie.

Question 4

On sait que \(P[A=a, M=m]=P[M=m|A=a]*P[A=a]\). a peut prendre uniformément 11 valeurs possibles donc théoriquement \(P[A=a]=\frac{1}{11}\).
Pour cette question, on peut déjà dire que pour tout \(m>a, P[A=a, M=m]=0\). En effet, m est le max des trois valeurs tirées dans l’intervalle \([0,a]\), donc \(P[A=a, M=m]>0\) implique \({m}\le{a}\). De même, on peut dire que \(P[A=0, M=0]=\frac{1}{11}\) car le max des valeurs tirées dans l’intervalle \([0,0]\) est 0 donc \(P[M=0|A=0]=1\). Je m’attends aussi à ce que plus m sera proche de a (tout en respectant la condition \({m}\le{a}\)), plus \(P[A=a, M=m]\) sera élevée.


Pour simuler cette expérience, je crée un vecteur prob_a, qui va contenir P(A=a) pour chaque valeur de a. Je crée ensuite une matrice “prob_et” contenant les valeurs de \(P[M=m,A=a]\) pour les différents m et a possibles. Une fois cette matrice créée, j’affiche pour tous les a et m possibles le résultat de \(P[M=m,A=a]\).

#prob_a est un vecteur de taille 11 contenant les valeurs expérimentales de P(A=a).
prob_a=c()
for(i in 1:11){
  a=replicate(1000,sample(0:10/10,1,T))
  for(j in 1:1000){
    if (a[j]==(i-1)/10){
      a[j]=1
    }else{
      a[j]=0
    }
  }
  prob_a[i]=mean(a)
}

#prob_sachant est une matrice contenant P(M=m|A=a) pour toutes les valeurs de m et de a

prob_et=matrix(nrow = 11, ncol = 11, dimnames = list(c("a=0","a=0.1","a=0.2","a=0.3","a=0.4","a=0.5","a=0.6","a=0.7","a=0.8","a=0.9","a=1"),c("m=0","m=0.1","m=0.2","m=0.3","m=0.4","m=0.5","m=0.6","m=0.7","m=0.8","m=0.9","m=1")));
for(i in 1:11){
  for(j in 1:11){
    echantillon=replicate(100,max(sample(0:(i-1)/10,n,T)))
    for(k in 1:100){
      if(echantillon[k]==(j-1)/10){
        echantillon[k]=1
      }else{
        echantillon[k]=0
      }
    }
    prob_et[i,j]=mean(echantillon)*prob_a[i]
    cat("P[a=",(i-1)/10,", m=",(j-1)/10,"] = ",prob_et[i,j],"\n")
  }
}
## P[a= 0 , m= 0 ] =  0.092 
## P[a= 0 , m= 0.1 ] =  0 
## P[a= 0 , m= 0.2 ] =  0 
## P[a= 0 , m= 0.3 ] =  0 
## P[a= 0 , m= 0.4 ] =  0 
## P[a= 0 , m= 0.5 ] =  0 
## P[a= 0 , m= 0.6 ] =  0 
## P[a= 0 , m= 0.7 ] =  0 
## P[a= 0 , m= 0.8 ] =  0 
## P[a= 0 , m= 0.9 ] =  0 
## P[a= 0 , m= 1 ] =  0 
## P[a= 0.1 , m= 0 ] =  0 
## P[a= 0.1 , m= 0.1 ] =  0.099 
## P[a= 0.1 , m= 0.2 ] =  0 
## P[a= 0.1 , m= 0.3 ] =  0 
## P[a= 0.1 , m= 0.4 ] =  0 
## P[a= 0.1 , m= 0.5 ] =  0 
## P[a= 0.1 , m= 0.6 ] =  0 
## P[a= 0.1 , m= 0.7 ] =  0 
## P[a= 0.1 , m= 0.8 ] =  0 
## P[a= 0.1 , m= 0.9 ] =  0 
## P[a= 0.1 , m= 1 ] =  0 
## P[a= 0.2 , m= 0 ] =  0 
## P[a= 0.2 , m= 0.1 ] =  0.00267 
## P[a= 0.2 , m= 0.2 ] =  0.08633 
## P[a= 0.2 , m= 0.3 ] =  0 
## P[a= 0.2 , m= 0.4 ] =  0 
## P[a= 0.2 , m= 0.5 ] =  0 
## P[a= 0.2 , m= 0.6 ] =  0 
## P[a= 0.2 , m= 0.7 ] =  0 
## P[a= 0.2 , m= 0.8 ] =  0 
## P[a= 0.2 , m= 0.9 ] =  0 
## P[a= 0.2 , m= 1 ] =  0 
## P[a= 0.3 , m= 0 ] =  0 
## P[a= 0.3 , m= 0.1 ] =  0 
## P[a= 0.3 , m= 0.2 ] =  0.0072 
## P[a= 0.3 , m= 0.3 ] =  0.0776 
## P[a= 0.3 , m= 0.4 ] =  0 
## P[a= 0.3 , m= 0.5 ] =  0 
## P[a= 0.3 , m= 0.6 ] =  0 
## P[a= 0.3 , m= 0.7 ] =  0 
## P[a= 0.3 , m= 0.8 ] =  0 
## P[a= 0.3 , m= 0.9 ] =  0 
## P[a= 0.3 , m= 1 ] =  0 
## P[a= 0.4 , m= 0 ] =  0 
## P[a= 0.4 , m= 0.1 ] =  0 
## P[a= 0.4 , m= 0.2 ] =  0.00094 
## P[a= 0.4 , m= 0.3 ] =  0.0094 
## P[a= 0.4 , m= 0.4 ] =  0.08648 
## P[a= 0.4 , m= 0.5 ] =  0 
## P[a= 0.4 , m= 0.6 ] =  0 
## P[a= 0.4 , m= 0.7 ] =  0 
## P[a= 0.4 , m= 0.8 ] =  0 
## P[a= 0.4 , m= 0.9 ] =  0 
## P[a= 0.4 , m= 1 ] =  0 
## P[a= 0.5 , m= 0 ] =  0 
## P[a= 0.5 , m= 0.1 ] =  0 
## P[a= 0.5 , m= 0.2 ] =  0 
## P[a= 0.5 , m= 0.3 ] =  0 
## P[a= 0.5 , m= 0.4 ] =  0.01547 
## P[a= 0.5 , m= 0.5 ] =  0.07826 
## P[a= 0.5 , m= 0.6 ] =  0 
## P[a= 0.5 , m= 0.7 ] =  0 
## P[a= 0.5 , m= 0.8 ] =  0 
## P[a= 0.5 , m= 0.9 ] =  0 
## P[a= 0.5 , m= 1 ] =  0 
## P[a= 0.6 , m= 0 ] =  0 
## P[a= 0.6 , m= 0.1 ] =  0 
## P[a= 0.6 , m= 0.2 ] =  0 
## P[a= 0.6 , m= 0.3 ] =  0.0021 
## P[a= 0.6 , m= 0.4 ] =  0.0042 
## P[a= 0.6 , m= 0.5 ] =  0.0147 
## P[a= 0.6 , m= 0.6 ] =  0.0798 
## P[a= 0.6 , m= 0.7 ] =  0 
## P[a= 0.6 , m= 0.8 ] =  0 
## P[a= 0.6 , m= 0.9 ] =  0 
## P[a= 0.6 , m= 1 ] =  0 
## P[a= 0.7 , m= 0 ] =  0 
## P[a= 0.7 , m= 0.1 ] =  0 
## P[a= 0.7 , m= 0.2 ] =  0 
## P[a= 0.7 , m= 0.3 ] =  0 
## P[a= 0.7 , m= 0.4 ] =  0.00249 
## P[a= 0.7 , m= 0.5 ] =  0.00249 
## P[a= 0.7 , m= 0.6 ] =  0.01494 
## P[a= 0.7 , m= 0.7 ] =  0.06142 
## P[a= 0.7 , m= 0.8 ] =  0 
## P[a= 0.7 , m= 0.9 ] =  0 
## P[a= 0.7 , m= 1 ] =  0 
## P[a= 0.8 , m= 0 ] =  0 
## P[a= 0.8 , m= 0.1 ] =  0 
## P[a= 0.8 , m= 0.2 ] =  0 
## P[a= 0.8 , m= 0.3 ] =  0 
## P[a= 0.8 , m= 0.4 ] =  0.00089 
## P[a= 0.8 , m= 0.5 ] =  0.00178 
## P[a= 0.8 , m= 0.6 ] =  0.00712 
## P[a= 0.8 , m= 0.7 ] =  0.02492 
## P[a= 0.8 , m= 0.8 ] =  0.06141 
## P[a= 0.8 , m= 0.9 ] =  0 
## P[a= 0.8 , m= 1 ] =  0 
## P[a= 0.9 , m= 0 ] =  0 
## P[a= 0.9 , m= 0.1 ] =  0 
## P[a= 0.9 , m= 0.2 ] =  0 
## P[a= 0.9 , m= 0.3 ] =  0 
## P[a= 0.9 , m= 0.4 ] =  0 
## P[a= 0.9 , m= 0.5 ] =  0.00178 
## P[a= 0.9 , m= 0.6 ] =  0 
## P[a= 0.9 , m= 0.7 ] =  0.00979 
## P[a= 0.9 , m= 0.8 ] =  0.02047 
## P[a= 0.9 , m= 0.9 ] =  0.05251 
## P[a= 0.9 , m= 1 ] =  0 
## P[a= 1 , m= 0 ] =  0 
## P[a= 1 , m= 0.1 ] =  0 
## P[a= 1 , m= 0.2 ] =  0 
## P[a= 1 , m= 0.3 ] =  0 
## P[a= 1 , m= 0.4 ] =  0 
## P[a= 1 , m= 0.5 ] =  0 
## P[a= 1 , m= 0.6 ] =  0.00099 
## P[a= 1 , m= 0.7 ] =  0.00099 
## P[a= 1 , m= 0.8 ] =  0.00693 
## P[a= 1 , m= 0.9 ] =  0.01881 
## P[a= 1 , m= 1 ] =  0.05841

Les résultats ci-dessus valident mes hypothèses initiales.

La probabilité de A=a sachant m=0,5 sera nulle pour les a allant de 0 à 0.4. En effet, si a appartient à l’intervalle [0,0.4], le max m des Xi tirés ne peut pas dépasser 0.4. J’ai aussi l’intuition que plus les valeurs de a seront proches de 0.5, plus P(A=a|M=0.5) sera grande. Pour moi, si on choisit a=0.9, P(A=a|M=0.5) sera faible car cela voudrait dire que sur l’invervalle [0,0.9], les Xi tirés sont tous dans l’intervalle [0,0.5] (très peu probable). Alors que si a=0.5, les Xi tirés sont dans l’intervalle [0,0.5], P(A=a|M=0.5) sera donc plus grand.
\(P(A=a | M = 0.5)=\frac{P(A=a , M=0.5)}{P(M=0,5)}\)
On calcule avec le code r suivant P(M=0.5) et on calcule ensuite le résultat de \(P(A=a | M = 0.5)\) en fonction de a:

#Je calcule P(M=0.5)
n=3
p=replicate(100,max(sample(0:10/10,n,T)))
for(i in 1:100){
  if(p[i]==0.5){
    p[i]=1
  }else{
    p[i]=0
  }
}
p=mean(p)
#J'affiche P(A=a|M=0.5) en fonction de a
prob_et[(1:11),6]/p
##        a=0      a=0.1      a=0.2      a=0.3      a=0.4      a=0.5 
## 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.52173333 
##      a=0.6      a=0.7      a=0.8      a=0.9        a=1 
## 0.09800000 0.01660000 0.01186667 0.01186667 0.00000000
#Je trace P(A=a|M=0.5) en fonction de a
plot(x=((1:11)-1)/10,y=prob_et[(1:11),6]/p, xlab="a", ylab="P(A=a|M=0.5)")

Les résultats expérimentaux montrent que \(P(A=a|M=0.5)\) semble à son maximum pour a=0.5. Donc si Alice annonce à Bob que m=0.5, Bob a tout intêret à répondre 0.5. Avec cette réponse il a plus d’une chance sur deux de gagner.

Question 5

On a \(M<1\) et \(α<1\) donc \(M^α>M\) et \(M^α<1\) donc cette technique semble être possible, mais je pense que Bob va souvent perdre en donnant une réponse trop élevée.

Je représente ici graphiquement l’expérience en représentant l’espérance des gains de Bob pour des alpha allant de 0.1 à 0.9 pour n=2 et n=10:

estimation <- function(n,alpha){
  A=runif(1,0,1)
  M=replicate(100,max(runif(n,0,A)))
  G=c()
  for (i in 1:100){
    if(M[i]**alpha>A){
      G[i]=0
    }else{
      G[i]=M[i]**alpha-M[i]
    }
  }
  return(mean(G))
}
est=c()
for(i in 1:9){
  est[i]=estimation(2,i/10)
}
plot(x=(1:9)/10,y=est, xlab="alpha", ylab = "gain avec n=2")

for(i in 1:9){
  est[i]=estimation(10,i/10)
}
plot(x=(1:9)/10,y=est, xlab="alpha", ylab = "gain avec n=10")

Comme on peut le constater, Bob ne va pas devenir riche avec cette technique, et les gains sont assez aléatoires, je ne vois pas un “meilleur” alpha parmi les autres.

Exercice 3: Un dernier jeu à base de max et de pile ou face

Question 6

Alice a une chance sur 2 de donner à Bob la valeur du nombre A2. En répondant oui à chaque fois, Bob a donc une chance sur deux de gagner.

Question 7

Une stratégie possible pourrait être que si Alice annonce un nombre strictement supérieur à 0.55, Bob dit oui. Si le nombre annocé est compris entre 0.45 et 0.55, Bob réponds aléatoirement. Enfin si le nombre est srictement inférieur à 0.45, Bob dit non.
Avec cette stratégie, si Alice choisit 0.4 et 0.6, il est évident que Bob gagne à tous les coups.
On va générer uniformément deux vecteurs a1 et a2 comprenant des valeurs entre 0 et 1 avec a1<a2 puis évaluer le pourcentage de gain en jouant avec cette stratégie.

a1= replicate(1000,runif(1,0,1))
a2=c()
gagne=c()
for(i in 1:1000){
  a2[i] = runif(1,a1[i],1)
}
pile_ou_face=replicate(1000,sample(0:1,1,T))
for(i in 1:1000){
  if((pile_ou_face[i]&&a2[i]>=0.55) || (!pile_ou_face[i]&&a1[i]<=0.45)){
    gagne[i]=1
  }else if(pile_ou_face[i]&&a2[i]>0.45&&a2[i]<0.55){
    repBob=sample(0:1,1,T)
    gagne[i]=repBob
  }else if(!pile_ou_face[i]&&a1[i]>0.45&&a1[i]<0.55){
    repBob=sample(0:1,1,T)
    gagne[i]=1-repBob
  }else{
    gagne[i]=0
  }
}

mean(gagne)*100
## [1] 67.8

Comme on peut le constater, avec cette stratégie, le pourcentage de gain tourne autour de 65%. Bob a donc un peu plus de 2 chance sur 3 de gagner.