Afin de m'entraîner un peu à programmer avec XCas,
j'ai voulu essayé de simuler l'exercice de dénombrement suivant:
Pour modéliser cette situation, je souhaitais donc créer une liste de tous les jurys possibles c'est à dire de 10 personnes prises sans ordre et sans remise parmi 17.Un jury est composé de 10 membres tirés au sort parmi 8 hommes et 9 femmes.
- Combien de jurys différents peut-on former?
- Combien de jurys avec 5 femmes et 5 hommes peut-on former?
- Monsieur X refuse de siéger avec Madame Y. Combien de jurys peut-on former dans ces conditions?
Je dois avouer que le seul procédé que j'ai trouvé est le suivant:
L'ensemble de départ est composé de 17 personnes, il est donc formé de 2^17 parties.
Chaque partie peut être représentée par un nombre en binaire compris entre 0 et 2^17-1
un "1" en ième position indique qu'on prend la personne n°i
un "0" en ième position indique qu'on ne prend pas la personne n°i
Je fais donc varier un entier entre 0 et 2^17-1.
Pour chaque décomposition en binaire, je garde l'élément si la somme des chiffres vaut 10.
Ma question est juste de savoir s'il y a plus simple où s'il existe une fonction intégrée permettant de réaliser cette simulation.
Je vous joins quand même mon programme: (Temps d'exécution: environ 2 min )
Code : Tout sélectionner
denJurys():=
{
local jurys,binaire,j;
// Nombre de Jurys avec parités.
local parite:=0;
// Monsieur X:"m1"
// Madame Y: "f1"
// Nombre de Jurys où M. X ne siège pas avec Mme Y
local jurysXY:=0;
// Liste des membres (8 hommes, 9 femmes)
local membres:=["m1","m2","m3","m4","m5","m6","m7","m8","f1","f2","f3","f4","f5","f6","f7","f8","f9"];
jurys:=[];
// Création de l'ensemble des jurys possibles.
for (j:=0;j<2^17;j++){
binaire:=enBinaire(j);
if(sum(binaire)==10){
local k,tmpList:=[];
for(k:=0;k<size(binaire);k++){
if (binaire[k]==1) tmpList:=append(tmpList,membres[k+17-size(binaire)]);
}
jurys:=append(jurys,tmpList);
}
}
print("Nombre de Jurys possibles:",size(jurys));
// Parcours de l'ensemble des jurys pour trouver:
// - le nombre de jurys avec parité hommes-femmes
// - le nombre de jurys où M. X ne siègent pas avec Mme Y
for(j:=0;j<size(jurys);j++){
local k,c:=0;
local bX:=false;
local bY:=false;
for(k:=0;k<size(jurys[j]);k++){
local mot:=jurys[j][k];
local initiale;
initiale:=mot[0];
if (initiale=="m") c++;
if (mot=="m1") bX:=true;
if (mot=="f1") bY:=true;
}
if (c==5) parite++;
if (bX==false or bY==false) jurysXY++;
}
print("Nombre de Jurys avec parité hommes-femmes:",parite);
print("Nombre de Jurys où M. X ne siège pas avec Mme Y:",jurysXY);
}:;
// Renvoie une liste représentant l'écriture en binaire du nombre n
// Exemple enBinaire(12) retourne [1,1,0,0]
enBinaire(n):=
{
if (n<2) return [n];
else {
local divEucl;
divEucl:=iquorem(n,2);
return concat(enBinaire(divEucl[0]),divEucl[1]);
}
}:;