Création de listes, and, formatage de chaîne, continuation de ligne

Python et les ravages de l'amour

Un exercice de probabilité tiré du livre «Les jeux mathématiques d'Eurêka »


Une bande de jeunes gens comporte trois garçons et trois filles. Au printemps, chacun d'eux tombe secrètement amoureux de façon hétérosexuelle et équiprobable d'un autre membre de la bande. Lors d 'une soirée confidences, ils constatent qu'aucun couple ne peut se former. Quelle était la probabilité que ce drame arrive ?

J'ai déja fait cet exercice en classe il y a quelques années. On peut compter tous les cas favorables (façon de parler) en distinguant différentes types de configuration...

Analyse du problème

Les trois filles s'appellent 0, 1 et 2 et les trois garçons 3, 4 et 5. Ça n'est pas très romantique mais ça nous gagnera du temps Une situation est donnée par une liste (u,v,w,x,y,z) où u est le garçon aimé par 0 donc u ∈ {3;4;5}, v est le garçon aimé par 1

Approche probabiliste

Finalement, l'ensemble des cas possibles est l'ensemble des listes (u,v,w,x,y,z) avec u,v,w ∈ {3;4;5} et x,y,z ∈ {0;1;2}.

Une situation est donc donnée par une liste du type (4,5,4,0,2,2) qui informe que :

0 aime 4
1 aime 5
2 aime 4
3 aime 0
4 aime 2
5 aime 2

Il reste à compter les listes tragiques, celles ou personne n'est aimé en retour. Il suffit de chercher pour chaque fille si elle est aimée en retour. En Python si e est la liste [4,5,4,0,2,2], e[0] représentera le garçon aimé par 0 donc 4 et e[e[0]] représentera e[4] donc la fille aimée par le garçon aimé par 0. Comme e[4]=2 on peut dire que 0 n'est pas aimée en retour car e[e[0]]≠0

Un essai de code

m=[[u,v,w,x,y,z] for u  in range(3,6) for v in range(3,6)
    for w  in range(3,6)    for x  in range(3) 
    for y  in range(3) for z  in range(3)]
a=0
for e in m:
    if e[e[0]]!=0 and e[e[1]]!=1 and e[e[2]]!=2:
        a=a+1
print "il y a %d chances sur %d qu'il ne puisse se former \
    aucun couple dans cette bande" %(a,len(m))

Commentaire

Les trois premières lignes du script créent la liste de tous les cas possibles, c'est donc une liste de listes . En fait ce n'est qu'une ligne coupée en trois; comme on est à l'intérieur d'une liste, Python fait comme si on avit une seule ligne de commande.

On a coupé la dernière ligne en deux avec le symbole \ Attention, il ne doit pas y avoir d'espace après \ sinon le symbole ne sert à rien.

La variable a va compter les cas tragiques

Télécharger le script sans coupure de ligne

Conclusion

On trouve 156 cas tragiques sur 729 soit environ 21,4%.

Prolongements

On peut changer le nombre de filles et de garçons, supprimer la contrainte hétérosexuelle, supprimer l'équiprobabilité en introduisant dans le groupe des idoles charismatiques.

On pourrait aussi avoir une approche statitstique ( simuler 10 000 situations ) et calculer la fréquence des cas tragiques.


fait le 5 novembre 2009