XL 2010 Creer tableau avec chiffres aleatoire

chubbaccaa

XLDnaute Nouveau
Bonsoir a tous , je cherche a faire un tableau de 40X40 cases
dans ces 1600 cases , je voudrez y mettre des chiffres compris entre 1 et 1600 , le tout aléatoirement
Jusqu'à maintenant j'arrive a rentré tout ces chiffres aléatoirement mais j'ai des doublons et il ne m'en faut pas
il faut que chaque cases est un chiffre diffèrent

Voila la formule que j'ai écrit dans A1 : =ALEA()*(1-1600)+1600

Je ne trouve as la solution , cela fait plusieurs jours que je cherche mais la , je sèche o_O

Quelqu'un peut il me dire ce qu'il ne va pas
Merci
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Chubbaccaa,
Tel qu'expliqué votre formule ne peut pas marcher.
Par définition, dans une série aléatoire un même nombre peut très bien apparaitre plusieurs fois. Sinon votre série n'est plus aléatoire. C'est du tirage au sort sans remise.
En fait vous voulez une série de nombres {1..1600} rangés aléatoirement.
C'est le rangement qui doit être aléatoire, non les valeurs.
En formules, je ne vois pas trop. Mais en VBA si. On peut utiliser le VBA ?
( si oui fournissez un petit fichier test pour avoir la structure de votre tableau )
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re, bonsoir Dranreb,
Just for the fun ... votre problème m'a amusé.
Un essai en PJ avec cette macro :
VB:
Option Base 1
Sub Rangement()
    Dim tablo(1600, 2), i%, j%, L%, C%, N%
    Application.ScreenUpdating = False
    For i = 1 To 1600       ' Le tableau est rempli en colonne 1 des nombres de 1 à 1600 et en colonne 2 de nombres aléatoires
        tablo(i, 1) = i
        tablo(i, 2) = Rnd
    Next i
    For i = 1 To 1600       ' On tri les nombres aléatoires par valeur croissante.
        For j = i To 1600   ' Ca revient à mélanger la liste de nombres de 1 à 1600 de façon aléatoire
            If tablo(i, 2) > tablo(j, 2) Then
                buffer = tablo(i, 1): tablo(i, 1) = tablo(j, 1): tablo(j, 1) = buffer
                buffer = tablo(i, 2): tablo(i, 2) = tablo(j, 2): tablo(j, 2) = buffer
            End If
        Next j
    Next i
    N = 1                   ' On écrit les valeurs dans le tableau
    For L = 2 To 41
        For C = 2 To 41
            Cells(L, C) = tablo(N, 1)
            N = N + 1
        Next C
    Next L
End Sub
Les valeurs seront uniques car uniques dans le tableau. Ce sont les valeurs aléatoires associées qui seront triées. Sur mon PC, un nouveau tirage prend 0.4s.
 

Pièces jointes

  • Rangement aléa.xlsm
    25.1 KB · Affichages: 8

chubbaccaa

XLDnaute Nouveau
Bonjour Chubbaccaa,
Tel qu'expliqué votre formule ne peut pas marcher.
Par définition, dans une série aléatoire un même nombre peut très bien apparaitre plusieurs fois. Sinon votre série n'est plus aléatoire. C'est du tirage au sort sans remise.
En fait vous voulez une série de nombres {1..1600} rangés aléatoirement.
C'est le rangement qui doit être aléatoire, non les valeurs.
En formules, je ne vois pas trop. Mais en VBA si. On peut utiliser le VBA ?
( si oui fournissez un petit fichier test pour avoir la structure de votre tableau )
Merci pour ta réponse
J'arrive a entrer dans le VBA ( Jamais utilisé )
Comment faire ce fichier test pour avoir la structure du tableau ?
 

chubbaccaa

XLDnaute Nouveau
Re, bonsoir Dranreb,
Just for the fun ... votre problème m'a amusé.
Un essai en PJ avec cette macro :
VB:
Option Base 1
Sub Rangement()
    Dim tablo(1600, 2), i%, j%, L%, C%, N%
    Application.ScreenUpdating = False
    For i = 1 To 1600       ' Le tableau est rempli en colonne 1 des nombres de 1 à 1600 et en colonne 2 de nombres aléatoires
        tablo(i, 1) = i
        tablo(i, 2) = Rnd
    Next i
    For i = 1 To 1600       ' On tri les nombres aléatoires par valeur croissante.
        For j = i To 1600   ' Ca revient à mélanger la liste de nombres de 1 à 1600 de façon aléatoire
            If tablo(i, 2) > tablo(j, 2) Then
                buffer = tablo(i, 1): tablo(i, 1) = tablo(j, 1): tablo(j, 1) = buffer
                buffer = tablo(i, 2): tablo(i, 2) = tablo(j, 2): tablo(j, 2) = buffer
            End If
        Next j
    Next i
    N = 1                   ' On écrit les valeurs dans le tableau
    For L = 2 To 41
        For C = 2 To 41
            Cells(L, C) = tablo(N, 1)
            N = N + 1
        Next C
    Next L
End Sub
Les valeurs seront uniques car uniques dans le tableau. Ce sont les valeurs aléatoires associées qui seront triées. Sur mon PC, un nouveau tirage prend 0.4s.
salut Sylvanu , alors la tu me scotch ,en si peux de temps
Je ne comprend pas du tout ce que tu as fait mais j'avoue que tu m'enlève une belle épine du pied
Je vais evidement me pencher sur ce VBA car franchement c'est top

Encore merci a toi
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re,
le principe par ex avec une matrice 3 par 3:
1- On fait un tableau de 9 lignes et 2 colonnes
2- On remplit la colonne 1 avec les nombres de 1 à 9
3- On remplit la colonne 2 avec les nombres aléatoires ( Dessin du haut )
4- On tri ce tableau sur les nombres aléatoires croissant ( Dessin du milieu )
5- On range les valeurs dans le tableau de la feuille. ( Dessin du bas )
Ci dessous 3 tirages successifs :
1674084600661.png
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Par formules. Suivez le mode opératoire ci-dessous :
  • Se placer sur la feuille Tirage

  • Appuyez sur la touche de fonction F9 => La feuille Tirage se recalcule
  • S'il n'y a pas de doublon alors la cellule AP2 est verte
  • S'il y a des doublons alors la cellule AP2 est rose (Les doublons sont aussi colorés en rose dans le tableau)

  • Quand le tirage vous convient :
  • Copier/Coller "En valeur" la zone A1:AN40 vers A1 de la feuille Résultat pour figer le résultat du tirage
 

Pièces jointes

  • chubbaccaa- tirage aléatoire- v1.xlsx
    85.9 KB · Affichages: 13
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Ma petite version VBA. Cliquer sur l'image des dés sur la feuille "Par VBA".

Le code dans Module1 :
VB:
Const N = 40

Public Sub CarreAleat()
Dim i&, j&, k&, p&, q&, aux, ti
   ti = Timer: Application.ScreenUpdating = False: Randomize
   ReDim t(1 To N + 1, 1 To N + 1)
   For i = 2 To N + 1: t(i, 1) = i - 1: t(1, i) = i - 1: Next
   For i = 2 To N + 1: For j = 2 To N + 1: k = k + 1: t(i, j) = k: Next j, i
   For i = 2 To N + 1: For j = 2 To N + 1: p = 2 + Int(Rnd * N): q = 2 + Int(Rnd * N): aux = t(i, j): t(i, j) = t(p, q): t(p, q) = aux: Next j, i
   Sheets("Par VBA").Range("a1").Resize(N + 1, N + 1) = t
   MsgBox "Durée : " & Format(Timer - ti, "0.00\ sec.")
End Sub
 

Pièces jointes

  • chubbaccaa- tirage aléatoire- v2.xlsm
    150.9 KB · Affichages: 8

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour MaPomme,
Joli ! Travailler directement sur une matrice carré, je n'y avais pas pensé. C'est futé. :)
J'ai essayé encore d'optimiser, juste pour le plaisir. J'arrive à encore gagner autour de 5% avec :
VB:
Option Explicit: Option Base 1
Sub MatAlea()
    Dim N As Byte, L As Byte, C As Byte, Rnd1 As Byte, Rnd2 As Byte, Buffer%, Mat(40, 40), T
    T = Timer: N = 40: Randomize
    For L = 1 To N: For C = 1 To N: Mat(L, C) = (L - 1) * N + C: Next C, L
    For L = 1 To N: For C = 1 To N
        Rnd1 = 1 + Int(N * Rnd): Rnd2 = 1 + Int(N * Rnd)
        Buffer = Mat(L, C): Mat(L, C) = Mat(Rnd1, Rnd2): Mat(Rnd1, Rnd2) = Buffer
    Next C, L
    [B2].Resize(N, N) = Mat
    MsgBox "Durée : " & Format(1000 * (Timer - T), "0 ms")
End Sub
 

Pièces jointes

  • Rangement aléa V4.xlsm
    20.8 KB · Affichages: 5

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @sylvanu ;) ,

Sur mon PC, si tu ajoutes un Application.ScreenUpdating = False à ton code alors l'exécution est encore plus rapide.
Je ne le pensais pas (car on n'écrit qu'une seule fois sur la feuille) ; mais toujours est-il, c'est ce que je constate.

Je n'utilise jamais Option Base. Je préfère définir mes bornes moi-même pour être sûr de ce que je fais et être indépendant de l'utilisateur. J'utilise Dim T(1 to 40 ,1 to 40) par exemple.
 
Dernière édition:

Discussions similaires

Réponses
3
Affichages
334

Statistiques des forums

Discussions
315 107
Messages
2 116 274
Membres
112 710
dernier inscrit
FJL