Épreuve pratique 2009, sujet 129

mercredi 4 novembre 2009
par  Alain BUSSER

Bien que l’énoncé commence par « à l’aide d’un tableur », un langage de programmation permet tout aussi facilement de faire la simulation. Alors encore une mission pour CaRMetal !

Urnes A puis B puis C

On utilise trois variables de type chaîne de caractères, a par exemple désigne la couleur de la boule tirée de l’urne A. Comme il y a 4 jetons noirs sur 10 dans l’urne A, la couleur du jeton sera noire si r est inférieur à 0,4 et blanche sinon (r étant un nombre pseudo-aléatoire entre 0 et 1). La variable gain est un entier, égal à 0, 1 ou 2. La variable effectif est le nombre de parties pour lesquelles le gain est 2. Enfin la variable freq (comme « fréquence ») contiendra le pourcentage de parties gagnées. Voici le script :

/*Programme tp 129a
Correction TP 129 2009
*/
var a,b,c;//les couleurs
var gain;//entier
var effectif=0;//nombre de 2
var freq;
for(i=0;i<500;i=i+1){
	if(Math.random()<0.4){
		a="noir";//4 jetons noirs sur 10
	} else {
		a="blanc";
	}
	if(Math.random()<0.7){
		b="noir";//7 jetons noirs sur 10
	} else {
		b="blanc";
	}
	if(Math.random()<0.6){
		c="noir";//6 jetons noirs sur 10
	} else {
		c="blanc";
	}
	gain=0;//gain initial
	if(a!=b) gain++;
	if(b!=c) gain++;
	if(gain==2) effectif++;
}
freq=effectif/500*100;
Alert("la fréquence de parties gagnées est "+freq+" %");

Les dernières lignes sont un peu mystérieuses : Celles avec « gain++ » veulent dire respectivement que si les couleurs a et b ne sont pas égales, la variable gain est incrémentée, et si b et c ne sont pas égales, la variable gain est à nouveau incrémentée. Enfin la toute dernière ligne aurait pu être simplifiée en « Println(freq) » mais les élèves de Seconde aiment bien ce genre d’affichage à la lisibilité améliorée.


Les deux stratégies

Doubler la taille du script est très rapide avec le copier-coller (et les modifications à apporter au deuxième bloc obtenu).

Voir le résultat

/*Programme tp 129b
Correction TP 129 2009
*/
var a,b,c;//les couleurs
var gain;//entier
var effectif1=0,effectif2=0;//nombre de 2
var freq1,freq2;
for(i=0;i<500;i=i+1){
	if(Math.random()<0.4){
		a="noir";//4 jetons noirs sur 10
	} else {
		a="blanc";
	}
	if(Math.random()<0.7){
		b="noir";//7 jetons noirs sur 10
	} else {
		b="blanc";
	}
	if(Math.random()<0.6){
		c="noir";//6 jetons noirs sur 10
	} else {
		c="blanc";
	}
	gain=0;//gain initial
	if(a!=b) gain++;
	if(b!=c) gain++;
	if(gain==2) effectif1++;
}
freq1=effectif1/500*100;
for(i=0;i<500;i=i+1){
	if(Math.random()<0.4){
		a="noir";//4 jetons noirs sur 10
	} else {
		a="blanc";
	}
	if(Math.random()<0.6){
		c="noir";//6 jetons noirs sur 10
	} else {
		c="blanc";
	}
	if(Math.random()<0.7){
		b="noir";//7 jetons noirs sur 10
	} else {
		b="blanc";
	}
	gain=0;//gain initial
	if(a!=c) gain++;
	if(c!=b) gain++;
	if(gain==2) effectif2++;
}
freq2=effectif2/500*100;
Alert("la fréquence de parties gagnées est "+freq2+" %");

Fin de la manip

La suite consiste à recopier à la main les sorties de 10 exécutions successives du script précédent pour compléter le tableau de l’énoncé, mais une boucle sur un nouvel indice appelé simulation (le numéro de la simulation) permet de faire imprimer le tableau par CaRMetal.

Voir ce script

/*Programme tp 129c
Correction TP 129 2009
*/
var a,b,c;//les couleurs
var gain;//entier
var effectif1,effectif2;//nombre de 2
var freq1,freq2;
for(simulation=1;simulation<=10;simulation++){
	effectif1=0;
	effectif2=0;
	for(i=0;i<500;i=i+1){
		if(Math.random()<0.4){
			a="noir";//4 jetons noirs sur 10
		} else {
			a="blanc";
		}
		if(Math.random()<0.7){
			b="noir";//7 jetons noirs sur 10
		} else {
			b="blanc";
		}
		if(Math.random()<0.6){
			c="noir";//6 jetons noirs sur 10
		} else {
			c="blanc";
		}
		gain=0;//gain initial
		if(a!=b) gain++;
		if(b!=c) gain++;
		if(gain==2) effectif1++;
	}
	freq1=Math.round(effectif1/500*100000)/1000;
	Print(freq1);
	Print(" , ");
	for(i=0;i<500;i=i+1){
		if(Math.random()<0.4){
			a="noir";//4 jetons noirs sur 10
		} else {
			a="blanc";
		}
		if(Math.random()<0.6){
			c="noir";//6 jetons noirs sur 10
		} else {
			c="blanc";
		}
		if(Math.random()<0.7){
			b="noir";//7 jetons noirs sur 10
		} else {
			b="blanc";
		}
		gain=0;//gain initial
		if(a!=c) gain++;
		if(c!=b) gain++;
		if(gain==2) effectif2++;
	}
	freq2=Math.round(effectif2/500*100000)/1000;
	Print(freq2);
	Println("");
}

Commentaires