Macro création de nombre aléatoire

Bonjour le forum,

je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676) et qui génère 500 000 lignes en dessous avec des combinaisons différentes de ces chiffres.

Faut il faire une macro ?

Merci d'avance pour votre collaboration

bonjour

peu etre que cela peu vous aider!!

=ALEA.ENTRE.BORNES(1;500000)

faudouy a écrit :

Bonjour le forum,

je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676) et qui génère 500 000 lignes en dessous avec des combinaisons différentes de ces chiffres.

Faut il faire une macro ?

Merci d'avance pour votre collaboration

bonjour,

peut-il y avoir 2 lignes identiques ? Non, je viens de voir que la réponse est dans la question ....

Merci Iliyes pour cette fonction, mais comment l'appliquer sur 500000 lignes dans la même colonne ?

Bonjour,

une solution via une macro. temps d'exécution évolue de façon exponentielle. Il te faudra être patient ... (+/- 10 minutes sur mon ordi, parfois le décompte en % reste figé(je ne sais pas pourquoi), mais cela n'empêche pas l'exécution de continuer)

Option Explicit
Sub genere8()

    Dim v() As Boolean, k, kl As Long, c As Boolean, g As String, dico As Object
    Dim nl As Long, l As Long, nlr As Long, i As Long, a As Long, combi As Long, ctr As Long, b As Long
    Dim recommence As Boolean
    nl = 500000 'nombre de séquences uniques à générer
    Set dico = CreateObject("Scripting.Dictionary") ' on utilise un dictionnaire pour vérifier l'unicité
    Do 'boucle de génération de nl séquences
        g = "" ' contiendra la séquence générée
        c = False ' indicateur de chiffre en double
        ReDim v(9) ' indicateurs de chiffres tirés
        For i = 1 To 8 ' on génère une séquence de 8 chiffres
            Do ' on tire un chiffre au hasard jusqu'à ce qu'on en trouve un qui soit correct
                recommence = False ' par défaut on ne recommence par le tirage du chiffre
                a = Application.RandBetween(0, 9) ' on tire un nombre au hasard entre 0 et 9
                If v(a) Then ' si chiffre déjà tiré
                    If c Then ' si double déjà tiré
                        recommence = True ' il faut tirer un autre chiffre
                    Else
                        c = True ' sinon on accepte le double
                    End If
                Else ' chiffre non encore tiré
                    v(a) = True ' on indicque que le chiffre est tiré
                End If

            Loop While recommence
            g = g & a ' on ajoute le chiffre tiré à la séquence
        Next i 'on tire 8 chiffres

        ' si la sequence n'est pas dans le dico on l'ajoute et on incrémente le nombre de séquences générées
        If Not dico.Exists(g) Then dico.Add g, True: combi = combi + 1:  Application.StatusBar = Format(combi / nl, "0.00%")
    Loop While combi < nl 'tant que le nombre de séquences à tirer n'est pas atteint

    ' copie du résultat dans la feuille, l'instruction resize est limitée à 65536
    ' ce qui suit vise à tenir compte de cette contrainte
    k = dico.keys 'on place les séquences dans le vecteur k
    b = 1 ' b = base pour la cellule de départ qui doit recevoir la première séquence
    ReDim Preserve k(1 To nl) ' on redimensionne le vecteur k en partant de 1
    If nl < 65536 Then l = nl Else l = 65536
    nlr = nl
    ReDim vg(1 To l) 'on dimensionne un tableau pouvant contenir le maximum de (65536 ou du nombre de séquences)
    For i = 1 To nl
        ctr = ctr + 1
        vg(ctr) = k(i) 'on charge le tableau vg avec les séquences du groupe en cours
        If ctr = l Then ' le groupe est complet
            Range("a" & b).Resize(l) = Application.Transpose(vg) 'on le copie dans la feuille courante
            b = i + 1 'on adapte la base pour la copie suivante
            nlr = nlr - l 'on adapte le nombre de séquences restant à copier
            If nlr < 65536 Then l = nlr Else l = 65536
            If l > 0 Then ReDim vg(1 To l) '
            ctr = 0
        End If
    Next i
End Sub

bonjour

ben....si tu étire sur quelques 100 lignes la formule

et puis su sélectionne ces cellules et tu met un copié/collé

je pense que c'est faisable

néanmoins c'est la solution facile

maintenant la macro de "h2so4" est beaucoup plus PRO ( je tire chapeau)

cordialement

Bonjour

merci pour ce code, il faut effectivement être patient mais Excel plante assez rapidement (message : ne répond pas).


En effet Iliyes mais je risque malgré tout d'avoir un doublon en étirant la formule ?

faudouy a écrit :

Bonjour

merci pour ce code, il faut effectivement être patient mais Excel plante assez rapidement (message : ne répond pas).

Il faut le laisser travailler, il finira par répondre. Excel ne plante pas, en tout cas chez moi. Ce qui arrive parfois et je ne comprend pas pourquoi c'est la mise à jour du pourcentage dans la barre de statut qui ne se fait plus, mais le programme continue.

Bonjour à tous,

parfois le décompte en % reste figé(je ne sais pas pourquoi)

Peut-être mettre un DoEvents régulier ? Il ne me semble pas en voir.

eric

eriiic a écrit :

Bonjour à tous,

parfois le décompte en % reste figé(je ne sais pas pourquoi)

Peut-être mettre un DoEvents régulier ? Il ne me semble pas en voir.

eric

tu as raison, il n'y en a pas.

Option Explicit
Sub genere8()

    Dim v() As Boolean, k, kl As Long, c As Boolean, g As String, dico As Object
    Dim nl As Long, l As Long, nlr As Long, i As Long, a As Long, combi As Long, ctr As Long, b As Long
    Dim recommence As Boolean
    nl = 500000 'nombre de séquences uniques à générer
   Set dico = CreateObject("Scripting.Dictionary") ' on utilise un dictionnaire pour vérifier l'unicité
   Do 'boucle de génération de nl séquences
       g = "" ' contiendra la séquence générée
       c = False ' indicateur de chiffre en double
       ReDim v(9) ' indicateurs de chiffres tirés
       For i = 1 To 8 ' on génère une séquence de 8 chiffres
           Do ' on tire un chiffre au hasard jusqu'à ce qu'on en trouve un qui soit correct
               recommence = False ' par défaut on ne recommence par le tirage du chiffre
               a = Application.RandBetween(0, 9) ' on tire un nombre au hasard entre 0 et 9
               If v(a) Then ' si chiffre déjà tiré
                   If c Then ' si double déjà tiré
                       recommence = True ' il faut tirer un autre chiffre
                   Else
                        c = True ' sinon on accepte le double
                   End If
                Else ' chiffre non encore tiré
                   v(a) = True ' on indicque que le chiffre est tiré
               End If

            Loop While recommence
            g = g & a ' on ajoute le chiffre tiré à la séquence
       Next i 'on tire 8 chiffres

        ' si la sequence n'est pas dans le dico on l'ajoute et on incrémente le nombre de séquences générées
       If Not dico.Exists(g) Then dico.Add g, True: combi = combi + 1:ctr=ctr+1:if ctr=500 then ctr=0:doevents:  Application.StatusBar = Format(combi / nl, "0.0%")
    Loop While combi < nl 'tant que le nombre de séquences à tirer n'est pas atteint

    ' copie du résultat dans la feuille, l'instruction resize est limitée à 65536
   ' ce qui suit vise à tenir compte de cette contrainte
   k = dico.keys 'on place les séquences dans le vecteur k
   b = 1 ' b = base pour la cellule de départ qui doit recevoir la première séquence
   ReDim Preserve k(1 To nl) ' on redimensionne le vecteur k en partant de 1
   If nl < 65536 Then l = nl Else l = 65536
    nlr = nl
    ReDim vg(1 To l) 'on dimensionne un tableau pouvant contenir le maximum de (65536 ou du nombre de séquences)
   For i = 1 To nl
        ctr = ctr + 1
        vg(ctr) = k(i) 'on charge le tableau vg avec les séquences du groupe en cours
       If ctr = l Then ' le groupe est complet
           Range("a" & b).Resize(l) = Application.Transpose(vg) 'on le copie dans la feuille courante
           b = i + 1 'on adapte la base pour la copie suivante
           nlr = nlr - l 'on adapte le nombre de séquences restant à copier
           If nlr < 65536 Then l = nlr Else l = 65536
            If l > 0 Then ReDim vg(1 To l) '
           ctr = 0
        End If
    Next i
End Sub

 

Bonsoir le Forum,

Merci h2so4 pour ton apport

Une question, cependant : pourquoi prévoir 500000 séquences au départ, alors que le nombre maxi de lignes est de 65536

et que le nombre de permutations pour 7 ou 8 items sur 8 est de 40320 ?

Merci de ta réponse

Cordialement

axion

axion a écrit :

Bonsoir le Forum,

Merci h2so4 pour ton apport

Une question, cependant : pourquoi prévoir 500000 séquences au départ, alors que le nombre maxi de lignes est de 65536

et que le nombre de permutations pour 7 ou 8 items sur 8 est de 40320 ?

Merci de ta réponse

Cordialement

axion

selon moi on parle d'un tirage de 8 chiffres dans un lot de 10 chiffres avec tolérance pour un doublon, on est bien au delà des 500.000 possibilités.

le nombre maximum de lignes est de l'ordre du million dans les dernières versions (dès la version 2007 si je ne m'abuse). Cependant, excel ne semble pas pouvoir gérer des transferts entre tableau vba et cellules de plus de 65536 éléments, d'où la nécessité d'un algorithme spécial pour transférer le contenu du tableau vba vers la feuille excel (on aurait pu faire ce transfert élément par élément mais c'eût été fort lent).

Bonsoir, H2so4

j'étais resté à 8/8 avec doublon éventuel selon l'expression d'énoncé :

je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676)

j'ai dû rater un post et je te remercie de ta réponse

Cordialement

axion

axion a écrit :

Bonsoir, H2so4

j'étais resté à 8/8 avec doublon éventuel selon l'expression d'énoncé :

je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676)

j'ai dû rater un post et je te remercie de ta réponse

Cordialement

axion

tu n'as pas raté de post, l'énoncé laissait place à l'interprétation. J'ai choisi une interprétation qui collait avec 500000 lignes.

Rechercher des sujets similaires à "macro creation nombre aleatoire"