Duc de Toscane avec Giac/XCAS

La fonction count_eq(val,liste) compte le nombre d'occurrences de val dans liste.

La fonction hasard(n) renvoie un entier entre 0 et n-1 compris.

La première idée consiste à utilier une boucle pour ranger les valeurs dans une liste :

Giac-XCAS
toscane(n) := {
  local T,k;
  T := NULL; 
  pour k de 0 jusque n-1 faire
      T[k] = T,  ((( 3 + hasard(6)) + hasard(6)) + hasard(6)) 
  fpour
  retourne("Obtenir 9  :" + count_eq(9,[T]) * 100.0/n + "%",
          " Obtenir 10 :" + count_eq(10,[T]) * 100.0/n + "%")
}:;

Nous allons plutôt employer =< pour la redéfinition de T[k] : on créé un tableau de taille fixe empli de zéros
et modifie en place la cellule k sans réévaluer tout le tableau ce qui fait gagner beaucoup de temps.

Giac-XCAS
toscane(n) := {
  local T,k;
  T := [ seq( 0, k = 1 .. n ) ]; 
  pour k de 0 jusque n-1 faire
      T[k] =< ((( 3 + hasard(6)) + hasard(6)) + hasard(6)) 
  fpour
  retourne("Obtenir 9  :" + count_eq(9,[T]) * 100.0/n + "%",
          " Obtenir 10 :" + count_eq(10,[T]) * 100.0/n + "%")
}:;

On obtient alors :

Giac-XCAS
> toscane(1000000)
                    "Obtenir 9  :11.5869%"," Obtenir 10 :12.4658%"

On gagne encore plus de temps en utilisant ranm(lignes,colonnes,’expérience’) qui renvoie une matrice lignes $\times$ colonnes où chaque terme est un
résultat de expérience.

Giac-XCAS
toscane(n):={
T:=ranm(1,n,(((3 + hasard(6)) + hasard(6)) + hasard(6)));
retourne("Obtenir   9 :" + count_eq(9,T) * 100.0/n + "%",
         " Obtenir 10 :" + count_eq(10,T)* 100.0/n + "%")
}:;

Sucre : le lièvre et la tortue...

On rappelle le jeu bien connu : on dispose d’un dé cubique. On le lance. Si un six sort, le lièvre gagne sinon la tortue avance
d’une case. La tortue a gagné lorsqu’elle a avancé six fois de suite.

Il est aisé de montrer que la probabilité que la tortue gagne est égale à ${6 \choose 5}^6\approx 0,335$

Voici un exemple de simulation de n parties avec XCAS :

Giac-XCAS
jeutortue(n):={
  local simul,L,T,face,lancer;
  L:=0;T:=0;
  pour simul de 1 jusque n faire
     face:=hasard(6)+1;
     lancer:=1;
     tantque(face<6) et (lancer<6) faire
         face:=hasard(6)+1;
         lancer+=1;
     ftantque
     si face==6
        alors L+=1
        sinon T+=1
     fsi
  fpour
  retourne("Tortue :" + T*100.0/n + "% Lièvre : " + L*100.0/n + "%")
}:;

Par exemple:

Giac-XCAS
>>jeutortue(100000)
                 Tortue :33.639% Lievre : 66.361%