• Aucun résultat trouvé

Un problème de référence : la chasse aux canards

Chapitre 17. Quelques exemples de simulations

1. Un problème de référence : la chasse aux canards

1.1 Chassons le canard

 C’est un problème de référence dans la situation d’une part, mais aussi dans la façon dont nous traiterons cette simulation avec TI-Nspire.

C’est une simulation classique qui apparaît pour la première fois sans doute dans l’excellent livre d’Arthur Engel Les certitudes du hasard1.

Le cadre : dix chasseurs tirent sur dix canards.

Comme ils sont adroits… les chasseurs… ils ne ratent jamais leur cible.

Comme ils n’ont pas de chance… les canards… ils passent de vie à trépas dès qu’ils sont touchés…

Un vrai cauchemar pour les volatiles ! Leur seul espoir de s’en tirer, enfin pour quelques-uns seulement : les chasseurs ne se mettent pas d’accord sur le canard qu’ils visent et ne tirent qu’une fois… Si un malheureux canard, visé par plusieurs chasseurs, est en quelque sorte « tué » plusieurs fois, d’autres survivront !

Pas la peine de faire un dessin : le nombre de canards survivants est donc au mieux de neuf, si tous les chasseurs se sont défoulés au hasard sur un seul oiseau (sera-t-il seulement mangeable, le pauvre ?) ; au pire, aucun si les chasseurs sans le vouloir ont tous tué chacun le leur.

Une seule question, pour les canards, mais aussi pour les chasseurs, pour des raisons exactement opposées : combien peut-on en moyenne espérer de survivants après cette boucherie ?

Première méthode : on fait venir les chasseurs, les canards etc. On les met par 10, chasseurs, canards, dans une pièce, les coups de feu expédient les canards ad patres… On compte les survivants… enfin chez les canards…

Et puis, on recommence avec une autre série2

Ou alors on fait une simulation. Ceux qui n’en verront pas l’avantage seront de mauvaise foi. Elle est moins bruyante, moins traumatisante et surtout moins sanglante. Plus propre, plus rapide et plus économique.

Certes, mais comment simuler cette partie de chasse ?

L’idée est de récupérer une succession de 10 chiffres aléatoires, comme par exemple : 9 0 6 8 4 6 5 2 8 8.

en convenant qu’un chiffre représente le numéro du canard tué. Ainsi, dans notre exemple, on peut constater que le canard 8, le pauvre, a été tué 3 fois3… Oui mais son sacrifice a permis que le canard 1 ou 3 par exemple en réchappe.

Combien de survivants dans notre exemple ? 3 canards, les 1, 3, 7, correspondant aux chiffres qui n’apparaissent pas…

Remarquons que selon ce modèle, chaque canard a autant de chances d’être tué ou de survivre que son voisin.

1 Qu’on ne peut que recommander si vous ne l’avez pas encore dans votre bibliothèque. ALEAS Editeur.

2 Pensez à changer les canards car les survivants seront traumatisés !

3 Par les chasseurs 4, 9 et 10… ce qui correspond aux rangs des 8 dans les 10 chiffres.

1.2 Simulation sur le tableur

 Le tableur est particulièrement indiqué. Dans une feuille de calcul, on saisit dans la colonne A l’instruction =randint(0,9,10). On peut appeler cette colonne salve.

Reste à déterminer les numéros qui ne sont pas sortis dans cette salve… Le plus simple est de compter combien de fois chaque numéro de 0 à 9 apparaît. Par conséquent, dans la colonne B, on écrit donc tous les nombres entiers de 0 à 9, correspondant à chaque numéro de canard. En C1, on rentre

=countif(salve,b1). La recopie vers le bas donne les autres réponses.

Les survivants sont donc les indemnes, c’est-à-dire les numéros en face desquels se trouve un 0.

Combien y en-a-t-il ? On peut le faire toujours avec countif. Dans la cellule D1, on tape :

=countif(c1:c10,0).

et on mémorise le résultat dans la variable surv. Réponse : 4 dans notre exemple…

Pour la répéter, on relance les calculs avec CTRL R. Le résultat oscille souvent autour des valeurs 3 et 4.

1.3 Capture de la variable

 Mais il faudrait pouvoir garder la trace de ces résultats. On peut le faire en capturant les données, selon les modalités qui suivent :

on ajoute à surv dans la cellule D1 un petit quelque chose d’aléatoire (rand()/108) qui permet d’être sûr qu’à chaque répétition, la variable surv change de valeur4, si ce n’est sur le nombre de survivants, au moins sur cette partie aléatoire5 ;

la capture proprement dit se fait dans la colonne F ;

la colonne G permet de récupérer le bon résultat, en prenant la partie entière ;

On peut alors en H1 calculer le nombre moyen de survivants, en I5 et I6 leur maximum et minimum.

4 Faute de quoi, la variable surv n’est capturée qu’une fois, ce qui fausse évidemment le résultat.

5 Il est en effet très peu probable que rand()/108 prenne deux fois de suite la même valeur.

CTRL R6 relance l’expérience et les valeurs capturées apparaissent alors dans la colonne F. On observe que le nombre moyen de survivants s’élève à peu près à 3,5, avec un minimum d’aucun survivant – c’est sans doute très rare – et un maximum de 6 survivants.

Évidemment les outils de représentation graphique statistiques peuvent-être utilisés (en nommant par exemple ff la colonne G de tous les résultats des simulations).

Voici ce que donnent par exemple les diagrammes en bâtons : on peut de visu constater les effectifs plus importants des 3 et 4…

6 Quand CTRL est pressée, un appui long sur la touche R fait avancer la simulation de quelques dizaines d’expériences.

 Pourquoi sur cet exemple ne pas pousser l’automatisation jusqu’au bout… CTRL R, c’est bien pour relancer le calcul mais quelque peu fastidieux. On gagnerait à appuyer une fois sur un bouton pour lancer les simulations.

On commence par partager horizontalement la feuille de calcul.

Dans la partie inférieure, on ouvre l’application Géométrie, juste pour y insérer un curseur, associé à une variable n, dont les valeurs par exemple varient à 1 à 2000 par pas entier (cliquer sur le menu contextuel Réglages).

La variable du curseur n en se modifiant doit permettre le re-calcul de toute la feuille. Mais il faut la placer à un endroit stratégique : la colonne A, celle que nous avons appelé salve, est tout indiquée. Il suffit d’ajouter au calcul précédent 0 × n, qui ne changera rien au calcul effectué, mais qui relancera le calcul à chaque changement de la variable n. Autrement dit nous saisissons :

salve:=int(randint(0,9,10)+0×n Et c’est tout…

L’animation du curseur relance le calcul de la colonne A et par contrecoup provoque les simulations successives ; le fait que le curseur varie de 1 en 1 permet de contrôler, même sommairement, le nombre de simulations effectué7.

L’ensemble du classeur est remis à jour, et notamment le diagramme statistique, dont il vaut mieux graduer l’axe vertical en pourcentages. En demandant Zoom - Données, on ajuste parfaitement la fenêtre aux valeurs obtenues.

1.4 Écriture d’une fonction

Demeure aussi la possibilité d’écrire une fonction : c’est sûrement moins beau, mais plus rapide. On peut procéder de façon très simple, en gérant une liste à n éléments, représentant nos canards (n = 10 pour nous… mais rien n’interdit de généraliser).

7 Il faut alors penser à réinitialiser la capture. On se place sur l’instruction capture et on valide par ENTER.

La liste est initialisée à 0 : ces 0 signifient que les canards au départ sont tous vivants. Et puis commencent les tirs des chasseurs : tir simulé avec randint(0,n–1). Le résultat, comme pour le tableur, représente le numéro du canard abattu ; pour indiquer que le canard est tué, on choisit de mettre un 1 dans la liste à l’élément correspondant à ce canard (s’il était à 0 juste avant, c’est que le canard vient d’être tué ; sinon, c’est que le canard a été tué « plusieurs fois », mais on s’en soucie peu). Remarquer le décalage d’indice, car le canard numéro 0 se trouve à la position 1 de la liste…

À la fin des n salves, il reste juste à compter le nombre de 0 dans la liste, correspondant aux canards ayant échappé à tous les coups de fusil.

Les résultats obtenus sont les suivants…

Enfin pour calculer le nombre moyen de canards survivants, il suffit de définir en ligne de commande la fonction suivante :

Avec 10 canards, on peut donc raisonnablement espérer qu’en moyenne 3,48 canards survivent à cette boucherie.

Cela ouvre la porte à des simulations plus étoffées, comme le montrent les exemples ci-dessous, qui s’exécute à l’ordinateur en un.

Avec un millier de ces volatiles caquetant, on peut espérer presque 368 survivants.

On obtient proportionnellement plus de survivants, mais la boucherie frappe l’un dans l’autre à peu près la même fraction de la population totale.

1.5 Quelques éléments théoriques indépendante n’importe lequel des 9 autres canards.

Cette probabilité est bien sûr la même pour chacun des canards. Par conséquent, si l’on raisonne globalement, à la fin des 10 tirs, un peu plus de 34 % des canards auront survécu.

Le nombre moyen de survivants que l’on peut espérer à l’issue de l’expérience « sanglante » est donc :

10  0,3486  3,486

résultat peu éloigné de ceux que l’on a obtenu lors de nos simulations.

Attention aux conclusions hâtives… Malgré les apparences, la loi qui donne le nombre de canards tués n’est pas une loi binomiale : pour s’en convaincre, il suffit de se souvenir que les épreuves successives ne sont pas indépendantes. Par exemple, pour le 10e canard, si par un curieux hasard on apprend qu’aucun des autres canards ne sera tué, on ne donnera pas cher de sa peau… et pour cause ! Remarquons enfin que dans le cas de n chasseurs et n canards, avec les mêmes règles du jeu, la canards survivants à l’issue des n tirs. On sait que quand n tend vers l’infini, cette dernière probabilité tend vers 1 0,367

e . On retrouve là la valeur qu’on a obtenue avec 1 000 canards à peu de choses près.

Bref, même si n grandit, il demeurera toujours un peu plus d’un tiers de canards survivants en moyenne.

La loi du nombre de survivants peut être déterminée, mais c’est un peu plus délicat. Nous nous placerons dans le cas de 10 canards.

Notons  = {H1, …, H10} l’ensemble des 10 chasseurs, et  = {C1, …, C10}, supposés distingués par des prénoms (Alphonse, Bernard, … pour les premiers ; Donald, Saturnin, … pour les seconds) ou si l’on préfère des numéros autour du cou.

Une salve peut s’interpréter comme une application de  dans , chaque chasseur ayant pour image le canard qu’il a tué. Application comme on l’a vu qui est tout à fait quelconque. Il y a donc autant de salves possibles que d’applications de  dans  soit 1010.

Appelons maintenant X la variable aléatoire égale au nombre de canards survivants après la boucherie.

Soit k un entier compris entre 0 et 9, le nombre de survivants possibles.

Dire que X = k signifie qu’il y a exactement k survivants, donc 10 – k tués.

Sk 8 surjections entre ces deux ensembles.

Ceci donne le nombre de façons de tuer les 10 – k premiers, et de laisser survivre les k derniers.

Mais d’autre part, on a  10

  k façons choisir les k survivants parmi les 10 canards et comme précédemment pour chacun de ces choix, S

10,10k

façons de tuer les 10–k autres canards. Bref, on a donc 10 S

10,10 k

8 S(n,p) désigne le nombre de surjections d’un ensemble à n éléments dans un ensemble à p éléments.

9 Voir l’annexe de ce chapitre.

… on peut comparer entre les résultats obtenus sur une simulation de 10 000 salves déterminée par la fonction suivante :

… et les valeurs théoriques attendues.

On obtient évidemment des valeurs très proches :

Les trois dernières colonnes préparent un test de khi2 à la mode terminale : la distance khi2 obtenue vaut 3,03, soit bien moins que 16,919 (=invkhi2(0.95,9))

Il reste le calcul de l’espérance du nombre de canards tués :

Le chemin était plus tortueux, certes, mais on retrouve la même valeur que précédemment !