Matrice d'entiers aléatoire
Bonjour,
Ci dessous mon petit script :
Public Sub Macro3()
Dim Tableau(13, 4) As Integer
For K = 1 To 4
For J = 1 To 13
Tableau(J, K) = (K - 1) * 13 + J
Next J
Next K
End Sub
J'ai donc rempli une matrice avec les entiers de 1 à 52 / J'aurais voulu les mêmes entiers (1 à 52 sans répétition) mais positionnés de façon aléatoire.
Merci de votre aide / Amitiés
Bonsoir Cardinal361
Cliquer sur le bouton Hop! qui est est associé à la procédure "Melanger52" dans Module1 :
Sub Melanger52()
Dim tableau(1 To 13, 1 To 4), i&, j&, p&, q&, aux
For i = 1 To 13: For j = 1 To 4: p = p + 1: tableau(i, j) = p: Next j, i
Randomize
For i = 1 To 13: For j = 1 To 4
p = 1 + Int(13 * Rnd): q = 1 + Int(4 * Rnd)
aux = tableau(i, j): tableau(i, j) = tableau(p, q): tableau(p, q) = aux
Next j, i
Range("a1").Resize(13, 4) = tableau
End Sub
Merci Monsieur Votrefraise,
C'est exactement ce que je voulais.
Je ne suis pas encore sûr de comprendre comment on évite la répétition , c'était mon vrai souci, mais je vais regarder de plus près l'utilisation de aux.
Merci encore / Amitiés
Re
Cardinal361 i écrit :
Je ne suis pas encore sûr de comprendre comment on évite la répétition , c'était mon vrai souci, mais je vais regarder de plus près l'utilisation de aux.
Le principe :
- on remplit le tableau Tableau() avec les nombres de 1 à 52 (boucle i, j). Donc remplissage sans doublon :
For i = 1 To 13: For j = 1 To 4: p = p + 1: tableau(i, j) = p: Next j, i
Une fois Tableau() rempli avec les valeurs de 1 à 52, on va le "mélanger" :
- on va parcourir tous les éléments de Tableau un par un au moyen d'une boucle i, j
For i = 1 To 13: For j = 1 To 4
- pour i et j donné, on va calculer un nombre aléatoire p compris entre 1 et 13 (numéro de ligne) et on va aussi calculer un nombre aléatoire q compris entre 1 et 4 (numéro de colonne)
p = 1 + Int(13 * Rnd): q = 1 + Int(4 * Rnd)
- A ce stade, on considère les deux éléments de Tableau() : l'élément Tableau(i, j) et l'élément Tableau(p, q) choisi "au hasard". On va intervertir ces deux éléments.
- On aurait envie de coder
Tableau(i, j)=Tableau(p, q)
puisTableau(p, q)=Tableau(i ,j)
. Mais ça ne marche pas! En effet après la première instructionTableau(i, j)=Tableau(p, q)
, on a perdu la valeur de Tableau(i, j) puisque Tableau(i, j) vaut désormais aussi Tableau(p, q). Donc la seconde instruction affecte à Tableau(p, q) la valeur de Tableau(i, j) qui elle-même vaut Tableau(p, q) (via la première instruction). On se retrouve donc avec les deux éléments du tableau qui maintenant sont identiques => on ne les a pas échangés.
Il faut donc avant de procéder à l'échange, sauvegarder la valeur de Tableau(i, j) pour pouvoir la réutiliser par la suite. Et c'est là qu’intervient la variable aux :
aux = tableau(i, j) 'on sauvegarde la valeur de tableau(i, j) dans aux
tableau(i, j) = tableau(p, q) 'on affecte à tableau(i, j) la valeur de tableau(p, q)
tableau(p, q) = aux 'on affecte à tableau(p, q) l'ancienne valeur de tableau(i, j) sauvegardée dans aux
A ce stade, on a bien échangé les valeurs des deux éléments (i, j) et (p, q) (p et q choisis aléatoirement). On continue ces échanges aléatoires pour toutes les valeurs de i, j.
A la fin de la boucle (i, j), le tableau est entièrement mélangé.
Merci beaucoup, c'est trop gentil