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) puis Tableau(p, q)=Tableau(i ,j). Mais ça ne marche pas! En effet après la première instruction Tableau(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

Rechercher des sujets similaires à "matrice entiers aleatoire"