VISUAL BASIC & EXCEL
TP 10
Planche de Galton
Voici une solution possible :
'Chasse au trésor 'TP 10 ICES Année 2000 Dim N Sub Initialisation() Range("A1:P20").ClearContents Range("A1:J10").Clear Randomize For i = 1 To 6 Do L = Int(Rnd * 10) + 1 C = Int(Rnd * 10) + 1 Loop While Cells(L, C) = " " Cells(L, C) = " " Next Cells(1, 11) = "Ligne" Cells(1, 12) = "Colonne" Cells(1, 13) = "Nord" Cells(1, 14) = "Sud" Cells(1, 15) = "Est" Cells(1, 16) = "Ouest" N = 1 End Sub Sub Jeu() N = N + 1 L = ActiveCell.Row C = ActiveCell.Column Cells(N, 11) = L Cells(N, 12) = C Cells(N, 13) = Nord(L) Cells(N, 14) = Sud(L) Cells(N, 15) = Est(C) Cells(N, 16) = Ouest(C) If Cells(L, C) = " " Then Cells(L, C).Interior.ColorIndex = 3 Else Cells(L, C).Interior.ColorIndex = 4 End If 'on peut, pour simplifier la tâche du joueur, colorier en vert ' : toute la ligne si Nord(L)+Sud(L)=6 ' : ou toute la colonne si Ouest(C)+Est(C)=6 'If Nord(L) + Sud(L) = 6 Then Range(Cells(L, 1), Cells(L, 10)).Interior.ColorIndex = 4 'If Est(C) + Ouest(C) = 6 Then Range(Cells(1, C), Cells(10, C)).Interior.ColorIndex = 4 End Sub Function Nord(L) r = 0 For y = 1 To L - 1 'y désigne ici le n° de ligne For x = 1 To 10 'x désigne ici le n° de colonne If Cells(y, x) = " " Then r = r + 1 Next x Next y Nord = r End Function Function Sud(L) r = 0 For y = L + 1 To 10 For x = 1 To 10 If Cells(y, x) = " " Then r = r + 1 Next x Next y Sud = r End Function Function Est(C) r = 0 For x = C + 1 To 10 For y = 1 To 10 If Cells(y, x) = " " Then r = r + 1 Next y Next x Est = r End Function Function Ouest(C) r = 0 For x = 1 To C - 1 For y = 1 To 10 If Cells(y, x) = " " Then r = r + 1 Next y Next x Ouest = r End Function Sub Abandon() For L = 1 To 10 For C = 1 To 10 If Cells(L, C) = " " Then Cells(L, C) = "x" Next C Next L End Sub
2.1. Principe de la planche de Galton
Galton (1822-1911) était le cousin de Darwin et voulait justifier la transmission des capacités intellectuelles par l'hérédité pour permettre l'amélioration de l'espèce humaine. Son point de départ était le paradoxe suivant : comment expliquer qu'on observe à chaque génération une dispersion des tailles, qu'à celle des parents devra s'ajouter celle des enfants et, qu'en même temps la taille des individus d'une population et la dispersion par rapport à chaque moyenne reste constante quand les générations se succèdent ? .
Pour comprendre le phénomène, Galton réalisa une expérience à l'aide d'un plan incliné sur lequel il planta des clous disposés en quinconce. En faisant tomber un grand nombre de billes, en haut du plan incliné, on observe une répartition à l'arrivée qui suit une loi binomiale. Cette loi peut être approchée (théorème de la limite centrale) par la loi normale ou loi de Gauss.Voici 2 adresses internet (parmi d'autres) qui donnent des complément d'information. La première de ces adresses contient en particulier une simulation de l'expérience écrite en java :
http://www-sop.inria.fr/mefisto/java/tutorial1/node11.html
http://www.seti-quebec.org/chronique/simon/sem4/rouge.htmOn peut également voir cette expérience à la Cité des sciences de la Vilette à Paris. Le stand montrant la planche de Galton est celui qui attire le plus de visiteurs :
2.2. Simulation de la planche de Galton sur Excel
La planche de Galton sera la feuille de calcul. Les clous seront remplacés par des cellules noires disposées en quinconce comme ci-contre.
Le nombre de rangées de cellules noires sera choisi par l'utilisateur, ainsi que le nombre de billes à lancer.
Un histogramme permettra de montrer les fréquences obtenues pour chacune des colonnes réceptrices ainsi que les probabilités théoriques.
Voici comment peut se précenter la feuille de calcul une fois terminée :
2.3. Initialisation
Il faut d'abord régler manuellement les largeurs et hauteurs des cellules comme ci-dessus et regrouper par 2 les cellules des lignes 22, 23 et 24.
De même, il faut remplir manuellement les cellules V1 et V2 ainsi que les cellules X1 et X2.
La procédure Initialisation va permettre de mettre en place les " clous " (cellules noires) et d'effacer les données des lancers précédents.
Voici l'algorithme qui permet de faire cette initialisation :
Début Initialisation Effacer la plage de cellules A1 à U21 NombreRangées < Cellule X1 'NombreRangées doit être une variable globale NombreBilles < cellule X2 'NombreBilles doit être aussi une var. globale Pour L < 1 à NombreRangées Pour C < NombreRangées+2-L à NombreRangées+1+L par pas de 2 Colorier l'intérieur de la cellule(2L, C) en noir FinPour FinPour Effacer le contenu (pas le format) de la plage de cellules A22 à V25 Initialiser le générateurs de nombres aléatoires Fin Initialisation2.4. Procédure Lancer
Il s'agit de la procédure principale qui est associée au bouton " lancer les billes ". Les billes seront lâchées une à une et seront visualisées par une brève coloration en rouge de chacune des cellules traversées.
L'algorithme de cette procédure est le suivant :
Début LancerLesBilles Initialisation Pour bille < 1 à NombreBilles C < NombreRangées+1 'correspond à la colonne du milieu de la planche Pour L < 1 à NombreRangées Mettre brièvement la cellule (2L-1,C) en rouge X < Nombre aléatoire compris entre 0 et 1 Si X<0.5 alors C < C-1 'déplacement de la bille vers la gauche Sinon C < C+1 'déplacement de la bille vers la droite FinSi Mettre brièvement la cellule (2L-1,C) en rouge Mettre brièvement la cellule (2L,C) en rouge Mettre brièvement la cellule (2L+1,C) en rouge FinPour Cellule(22,C) < cellule(22,C)+1 'nombre de billes tombées dans C Cellule(23,C) < Cellule(23,C)/bille 'fréquence des billes tombées en C FinPour Pour C < 0 à NombreRangées Cellule(24,2C+1)( probabilité que la boule tombre dans la colonne C Si Cellule(23,2C+1) est vide alors Cellule(23,2C+1) < 0 Cellule(25,2C+1) < C FinPour Fin LancerLesBillesCette procédure fait appel plusieurs fois à la même action appliquée sur des cellulles différentes Mettre brièvement la cellule (L,C) en rouge. Voici comment on peut réaliser cette procédure :
Sub Allume(Ligne, Colonne) Cells(Ligne, Colonne).Interior.ColorIndex = 3 'j = 0 pour ralentir la trajectoire de la bille 'Do While j < 100000 ' j = j + 1 'Loop Cells(Ligne, Colonne).Interior.ColorIndex = 0 End SubEnfin, la probabilité que la boule tombe dans la colonne C suit la loi binomiale B(NombreRangées, 0.5). On peut l'obtenir facilement :
Function Prob(C) r = 1 n = C Do While n > 0 r = r * (NombreRangées + 1 - n) / n n = n - 1 Loop r = r * 0.5 ^ C * 0.5 ^ (NombreRangées - C) Prob = r End Function2.5. Graphique
Il suffit de sélectionner la zone de données A23 à V25 et de bien construire le graphique en fonction des indications fournies par l'assistant graphique.
3. Solution du TP 10
Comme il s'agit du dernier TP de l'année, on trouvera ci-dessous la solution complète du problème de la planche de Galton :
'Planche de Galton 'TP 10 ICES 2002 Dim NombreBilles, NombreRangées As Integer Sub Initialisation() Range(Cells(1, 1), Cells(21, 21)).Clear '10 rangées maximum NombreRangées = Cells(1, 24) If (NombreRangées < 1) Or (NombresRangées > 10) Then NombreRangées = 10 Cells(1, 23) = 10 End If NombreBilles = Cells(2, 24) For L = 1 To NombreRangées For C = NombreRangées + 2 - L To NombreRangées + 1 + L Step 2 Cells(2 * L, C).Interior.ColorIndex = 1 Next C Next L Range(Cells(22, 1), Cells(25, 22)).ClearContents Randomize End Sub Sub Allume(Ligne, Colonne) Cells(Ligne, Colonne).Interior.ColorIndex = 3 'j = 0 pour ralentir la trajectoire de la bille 'Do While j < 100000 ' j = j + 1 'Loop Cells(Ligne, Colonne).Interior.ColorIndex = 0 End Sub Function Prob(C) r = 1 n = C Do While n > 0 r = r * (NombreRangées + 1 - n) / n n = n - 1 Loop r = r * 0.5 ^ C * 0.5 ^ (NombreRangées - C) Prob = r End Function Sub Lancer() Initialisation For bille = 1 To NombreBilles C = NombreRangées + 1 For L = 1 To NombreRangées Allume 2 * L - 1, C If Rnd > 0.5 Then C = C + 1 Else C = C - 1 Allume 2 * L - 1, C Allume 2 * L, C Allume 2 * L + 1, C Next L Cells(22, C) = Cells(22, C) + 1 'nombre de billes tombées dans la colonne C Cells(23, C) = Cells(22, C) / bille 'fréquence des billes de la colonne C Next bille For C = 0 To NombreRangées Cells(24, 2 * C + 1) = Prob(C) Cells(25, 2 * C + 1) = C If Cells(23, 2 * C + 1) = "" Then Cells(23, 2 * C + 1) = 0 Next End Sub