Bon, pour ceux qui étaient là samedi soir et qui sont profs de math, voilà la question posée par écrit…
A ma droite, un Space Marine du chapitre des Blood Angels, armé d’un storm bolter et d’un gant énergétique (appelé mouffle dans le milieu). A ma gauche, un Genestealer Tynanide avec sa bite et le couteau (ou accessoirement trois paires de griffes). Au centre, les règles de Space Hulk, le jeu de plateau, et non celles de Warhammer 40K. J’ai pas vérifié mais je pense que ça change tout, ou sont passées mes sauvegardes de 2+? Mais je m’égare encore…
Le Marine lance un dé et y ajoute 1. Le Stealer lance trois dés et garde le plus grand. Si le Marine le souhaite, il peut alors obliger le Stealer à relancer un de ses dés. Puis, toujours s’il le souhaite, il peut relancer le sien. Les nouveaux scores des dés relancés sont toujours conservés, même si pire que le précédent. Le marine ajoute toujours 1 au dé qu’il lance, même lorsqu’il s’agit d’une relance. Lorsqu’il perd, le Marine déclenche systématiquement les relances. Si le résultat est nul, le Marine laisse couller.
La question est, quelle est la probabilité que le Marine arrive à décrocher un nul? Une victoire?
Ca c’est le cas d’un marine en défense, et qui a eu le temps de se mettre en garde. Les autres cas intéressants sont:
– pas eu le temps de se mettre en garde: pas de relance du dé marine;
– le marine attaque, donc le nul n’est pas une option: relance si nul, dans ce cas, le marine n’est jamais en garde;
– marine avec marteau de guerre et bouclier: 1d+2 au lieu de 1d+1. Pas de relance du dé stealer, le stealer ne lance que deux dés au lieu de trois.
Si vous avez le courrage…
Alors toi il est temps que tu reprennes le boulot…
Voici des approximations basées sur des simulations (10 000 000 simulations) :
Cas 1 : marine en défense :
Marine : 51,5%
Stealer : 17,5%
Cas 2 : marine pas eu le temps de se mettre en garde :
Marine : 39,65%
Stealer : 35,25%
Cas 3 : marine attaque : si perdu : relance stealer et marine. Si nul : relance stealer seulement
Marine : 60,2%
Stealer : 20,4%
Cas 4 : Marine avec marteau et bouclier. Stealer a 2 dés. Si le marine ne gagne pas, il relance son dé
Marine : 77,6%
Stealer : 15,4%
Je n’ai pas forcément vérifié à fond mon code.
Ca correspond à tes observations ?
Le code (java) :
import java.io.*;
import java.util.*;
public class CalculProba{
public class Personnage {
public int getPoints() {
return 0;
}
public void lance() {
return;
}
public int compareTo(Personnage p) {
if (p.getPoints()==getPoints()) return 0;
if (p.getPoints()<getPoints()) return 1;
return -1;
}
}
public class Stealer extends Personnage{
int[] de;
Random rnd;
int nb_de;
public Stealer() {
rnd=new Random();
de=new int[3];
nb_de=3;
}
public void setNbDe(int nb) {
nb_de=nb;
}
public void lance() {
for (int i=0 ; i<nb_de ; i++)
de[i]=1+rnd.nextInt(6);
}
public int getMax() {
int max=0;
for (int i=0 ; i<nb_de ; i++)
max=Math.max(max,de[i]);
return max;
}
public void relanceMax() {
int max=getMax();
for (int i=0 ; i<nb_de ; i++)
if (de[i]==max) {
de[i]=1+rnd.nextInt(6);
break;
}
}
public int getPoints() {
return getMax();
}
}
public class Marine extends Personnage{
int de;
Random rnd;
int avantage;
public Marine() {
rnd=new Random();
avantage=1;
}
public void setAvantage(int avantage) {
this.avantage=avantage;
}
public void lance() {
de=1+rnd.nextInt(6);
de+=avantage;
}
public int getPoints() {
return de;
}
}
public CalculProba() {
Marine marine=new Marine();
Stealer stealer=new Stealer();
int sc_marine=0;
int sc_stealer=0;
//****************
System.out.println("Marine en Défense");
for (int i=0 ; i<10000000 ; i++) {
marine.lance();
stealer.lance();
if (marine.compareTo(stealer)<0) {
stealer.relanceMax();
if (marine.compareTo(stealer)0) sc_marine++;
else if (marine.compareTo(stealer)<0) sc_stealer++;
}
System.out.println("Marine :"+(sc_marine/100000.0));
System.out.println("Stealer :"+(sc_stealer/100000.0));
//******************
sc_marine=0;
sc_stealer=0;
System.out.println("Marine en Défense pas le temps de se mettre en garde");
for (int i=0 ; i<10000000 ; i++) {
marine.lance();
stealer.lance();
if (marine.compareTo(stealer)0) sc_marine++;
else if (marine.compareTo(stealer)<0) sc_stealer++;
}
System.out.println("Marine :"+(sc_marine/100000.0));
System.out.println("Stealer :"+(sc_stealer/100000.0));
//*******************
sc_marine=0;
sc_stealer=0;
System.out.println("Marine en attaque. Si nul relance stealer et dans ce cas ne relance pas son dé");
for (int i=0 ; i<10000000 ; i++) {
marine.lance();
stealer.lance();
if (marine.compareTo(stealer)<0) {
stealer.relanceMax();
if (marine.compareTo(stealer)0) sc_marine++;
else if (marine.compareTo(stealer)<0) sc_stealer++;
}
System.out.println("Marine :"+(sc_marine/100000.0));
System.out.println("Stealer :"+(sc_stealer/100000.0));
//***************
sc_marine=0;
sc_stealer=0;
System.out.println("Marine avec marteau : dé+2 stealer ne relance pas et stealer 2 dés");
stealer.setNbDe(2);
marine.setAvantage(2);
for (int i=0 ; i<10000000 ; i++) {
marine.lance();
stealer.lance();
if (marine.compareTo(stealer)0) sc_marine++;
else if (marine.compareTo(stealer)<0) sc_stealer++;
}
System.out.println("Marine :"+(sc_marine/100000.0));
System.out.println("Stealer :"+(sc_stealer/100000.0));
}
public static void main(String[] args) {
new CalculProba();
}
}
@vivie : Ben moi aussi apparemment, il faudrait que je reprenne le boulot.
Ya des morceaux de codes qui n’apparaissent correctement (les séquences entre des « ») tant pis.
Ben merde, évidemment, si j’écris que les séquences entre tel caractère et tel autre n’apparaissent pas alors elles n’apparaîtrons pas non plus et on ne saura jamais de quels caractères il s’agit. re tant pis.
« Ca correspond à tes observations ? »
Dés que j’ai joué 10 000 000 combats, je te fait signe.
Et j’y pense… C’est pas trop la honte pour un mec qui a fait une maitrise de math pure de résoudre un problème comme ça? Ils vont encore te parler tes anciens potes de fac? Ou l’an prochain, tu recevra un carton d’invitation pour la seconde réunion annuelle, celle ou on invite que les physiciens et les mecs qui font des maths appli?
Non, t’inquiètes pas, je me suis arrêté en licence. Sans ça, je ne me serais jamais permis un truc pareil.
Oh, j’avais oublié. Tout va bien alors. Il vaut mieux qu’on en parle pas trop quand même… Je suis certain que tu ne voudrais pas que tous les matheux de la région te voient comme « le genre de type à faire des simulations »…