16/01/07 Corrigé TP n° 3 1
Exemple de programmation possible en C ++
#pragma hdrstop
#pragma argsused
#include <stdlib.h>
// pour utiliser la fonction srand initialisant le générateur de nombres //aléatoires :
#include <time.h>
#include <iostream>
#include <iomanip>
using namespace std;
int a,b,n;
long int NbExp;
double Prob[100],Freq[100];
double EspTh,EspObs,VarTh,VarObs;
//--- début des fonctions --- void double combi(int x, int y)
{
double Res;
if ((y == x) || (y == 0)) Res = 1;
else
Res = (x/(double)y) * combi(x-1,y-1);
return Res;
}
voud Initialisation();
{ for (int k = 0 ; k <= n ; k++) {
Prob[k] = combi(a,k)*combi(b,n-k)/combi(a+b,n);
Freq[k] = 0;
} }
void Experiences();
{ int NoTires[100];
bool Tire;
for (long int j = 1 ; j <= NbExp ; j++) {
int NbBl=0;// Pour chaque expérience compteur des boules blanches tirées int No = rand()%(a+b)+1;
// rand()%(a+b) génère un entier de l'intervalle
[ 1 ... a+b [
NoTires[1]
=
No;int NbT = 1; // nombre de boules tirées
while(NbT<n) // Tant qu'on n'a pas tiré n (boules) Nos différent(e)s {
Tire=true;
while (Tire) {
Tire=false;
16/01/07 Corrigé TP n° 3 2
No = rand()%(a+b)+1;
for(int i=1;i<=NbT;i++) {
if (No == NoTires[i]) Tire = true;
} }
NbBT++;
NoTires[NbBT] = No;
if ( No <= a ) // on compte les boules blanches NbBl++; // au fur et à mesure
}
Freq[NbBl]++;
}
// Mise à jour des fréquences relatives : for (int k = 0 ; k <= n ; k++)
Freq[k] = Freq[k] / NbExp;
}
void EsperancesVariances() {
EspTh = 0;
EspObs = 0;
VarTh = 0;
VarObs = 0;
for (int k=1;k<=n;k++) {
EspTh += k*Prob[k];
EspObs += k*Freq[k];
VarTh += k*k*Prob[k];
VarObs += k*k*Freq[k];
}
VarTh = VarTh -EspTh*EspTh;
VarObs = VarObs -EspObs*EspObs;
}
void Affichages()
{ cout << setw(9) << fixed << " X ";
for (int k = 0 ; k <= n ; k++) cout << setw(6)<< fixed << k;
cout << endl;
cout << setw(6)<<" Probas :";
for (int k = 0 ; k <= n ; k++)
cout << setw(6) << setprecision(3) << fixed << Prob[k];
cout << endl; <<
cout << setw(6)<<" Freq :";
for (int k = 0 ; k <= n ; k++)
cout << setw(6) << setprecision(3) << fixed << Freq[k];
cout << endl << endl;
EsperancesVariances();
cout<<" Esperance theorique : ";
cout<<setw(10)<<setprecision(5)<< fixed << EspTh << endl;
cout<<" Esperance observee : ";
16/01/07 Corrigé TP n° 3 3
cout<<setw(10)<<setprecision(5)<< fixed << EspObs << endl;
cout<<" Variance theorique : ";
cout<<setw(10)<<setprecision(5)<< fixed << VarTh << endl;
cout<<" Variance observee : ";
cout<<setw(10)<<setprecision(5)<< fixed << VarObs << endl;
}
//--- FIN des fonctions --- //--- début du programme principal --- int main(int argc, char* argv[])
{
srand(time(NULL));
cout << "Dans une boite on a A boules blanches er B boules noires";
cout<<"On tire au hasard n boules.";
cout<<" X est le nombre de boules blanches obtenues"
cout<<" X suit la loi hypergéométrique dont on fait la simulation par un grand nombre d'expériences simulant le tirage de n boules";
cout << "Nombre A de boules blanches : ";
cin >> a;
cout << "Nombre B de boules noires : ";
cin >> b;
cout << "Nombre de boules n a tirer (n<="<< A <<"et n<="<< B)<<" : ";
cin >> n;
cout << "Nombre de simulations du tirages de n boules ? ";
cin >> NbExp;
Initialisation();
Experiences();
Affichages();
cin.sync();
cin.get();
return 0;
}