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 :
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.
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 :
> 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.
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 :
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:
>>jeutortue(100000) Tortue :33.639% Lievre : 66.361%