IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB 6 et antérieur Discussion :

Nombre aléatoire


Sujet :

VB 6 et antérieur

  1. #1
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut Nombre aléatoire
    Bonjour,

    J'ai un nombre NB compris entre 0 et 10 que je veux générer aléatoirement.
    Mais pas tout à fait...

    J'ai fait un Randomize au chargement de mon formulaire, puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NB = CInt(Int((10 * Rnd())))
    Cela me génère pour 10 tirages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    3
    10
    7
    9
    7
    6
    5
    0
    0
    0
    Mais ce que je voudrais c'est qu'à la fin du 10è tirage,
    Tous les chiffres ont été tiré, parce que là j'ai plusieurs chiffres qui se répètent à la suite (0) et des chiffres qui reviennent (7)...

    Merci d'avance.

  2. #2
    Membre régulier
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2005
    Messages : 64
    Points : 95
    Points
    95
    Par défaut
    salut
    tu peut déclarer un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim tbl(0 to 9)as integer
    ensuite une fonction qui cherche si un nombre existe dans la tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private function Exists(nbr as integer)as boolean
    dim i as integer
    for i=0 to 9
    if tbl(i)=nbr then
    Exists=true
    exit function
    end if
    next i
    end function

    et maintenant tu ajoute dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    dim i as integer
    tbl(0)=CInt(Int((10 * Rnd())))   'le premier nombre aléatoire
    i=1
    while i<10
    NB = CInt(Int((10 * Rnd())))
    if not exists(nb) then 
       tbl(i)=nb
        i=i+1
    end if
    wend

  3. #3
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Avec quelques lignes de moins %)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       Dim NB As Integer, ret(0 To 9), k As Integer
        Randomize
     
        Do
            NB = CInt(Int((10 * Rnd())))
            If InStr(1, Join(ret, ","), CStr(NB)) = 0 Then ret(k) = NB: k = k + 1
        Loop Until k = 10

  4. #4
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Salut

    J'ai fait un petit test sur une form avec un bouton et une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Private Sub Command1_Click()
        Dim tabl(0 To 9) As Integer
        Dim i As Integer
        Randomize
        For i = 0 To 9
            Do
                tabl(i) = Rnd() * 10
            Loop Until EstUnique(tabl(i), i, tabl)
            List1.AddItem (tabl(i))
        Next i
    End Sub
     
    Private Function EstUnique(element As Variant, _
                               indice As Integer, _
                               tableau As Variant) As Boolean
        Dim i As Integer, b As Boolean
        i = 0
        b = False
        If indice > LBound(tableau) Then
            Do
                If element = tableau(i) Then b = True
                i = i + 1
            Loop Until (b) Or (i = indice)
        End If
        EstUnique = Not b
    End Function
    Je crois que tu peux utiliser la fonction EstUnique telle quelle. Le seul ennui est qu'elle s'avérera trop lente pour les tableaux contenant un grand nombre d'éléments.

  5. #5
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    En gros, le principe de ces boucles, c'est générer un autre nombre aléatoire tant que celui-ci ne soit pas deja tiré
    Mais pour un nombre elevé, elle va durer la boucle ?

    De plus, le nombre que je génère, dépend du nombre d'élement d'une liste !
    Donc où est-ce que je dois déclarer mon tableau et comment ?

    Merci.

  6. #6
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Il existe une solution plus simple et plus générale puisque qu'on peut choisir la liste du tirage
    et qui consiste à éliminer l'élément tiré de la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Dim tmp As String, a As Integer, b As String
     
        tmp = "0123456789": a = Len(tmp)
        ReDim ret(0 To a - 1)
     
        Randomize
     
        Do
            NB = CInt(Int(((a - k) * Rnd()))): b = Mid(tmp, NB + 1, 1)
            ret(k) = b: k = k + 1: tmp = Replace(tmp, b, "")
        Loop Until k = 10

  7. #7
    Expert confirmé
    Avatar de zazaraignée
    Profil pro
    Étudiant
    Inscrit en
    Février 2004
    Messages
    3 174
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2004
    Messages : 3 174
    Points : 4 085
    Points
    4 085
    Par défaut
    Exact!

  8. #8
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Merci pour vos réponses !

    Mais si le nombre aléatoire que je veux obtenir dépasse 9.
    Sur 2 chiffres donc, cela ne va pas fonctionner.

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    tiens une autre maniére ( sous le même principe quand même), en utilisant un tableau de booleen pour mémoriser les numéros déjà sortis...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Sub MonAlea()
     Dim iMax As Integer
     Dim bMemo() As Boolean
     Dim Nb As Integer
     Dim k As Integer
     iMax = 10
     iMin = 0
     ReDim bMemo(iMin To iMax)
     Randomize
     While k <= (iMax - iMin)
        Nb = Int((iMax - iMin + 1) * Rnd + iMin)
     
        If Not bMemo(Nb) Then
          bMemo(Nb) = True
          Debug.Print Nb 'Tirage... 'Rajouter ici le traitement à effectuer sur tirage...
          k = k + 1
     
        End If
        DoEvents
      Wend
    End Sub

  10. #10
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par Linaa
    Merci pour vos réponses !

    Mais si le nombre aléatoire que je veux obtenir dépasse 9.
    Sur 2 chiffres donc, cela ne va pas fonctionner.
    Il n'est pourtant pas très difficile à adapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Dim NB As Integer, ret(), k As Integer
        Dim tmp As String, a As Integer, b As String
     
        tmp = "AA,AB,ACK,BC,CB,GH,HIO,JK,LM,MO,": a = UBound(Split(tmp, ","))
        ReDim ret(0 To a - 1)
     
        Randomize
     
        Do
            NB = CInt(Int(((a - k) * Rnd()))): b = Split(tmp, ",")(NB)
            ret(k) = b: k = k + 1: tmp = Replace(tmp, "," & b & ",", ",")
        Loop Until k = a

  11. #11
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    tiens encore une autre maniére ... ce coup-ci on remplit un tableau avec les numéros à sortir... puis à chaque tirage on "enléve" le numéro du tableau ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    '
    ' Fonction efface element d'un tableau...
    '
    Function EffaceElement(lIndex As Long, t()) As Boolean
    Dim i As Long
    If lIndex > UBound(t) Then
      Debug.Print "Erreur index trop grand"
      EffaceElement = False
      Exit Function
    End If
    If lIndex < LBound(t) Then
      Debug.Print "Erreur index trop petit"
      EffaceElement = False
      Exit Function
    End If
    For i = lIndex To UBound(t) - 1
      t(i) = t(i + 1)
     
    Next
    ReDim Preserve t(UBound(t) - 1)
    EffaceElement = True
     
    End Function
     
    '
    ' Tirage aleatoire...
    '
    Sub MonAlea()
     Dim iMax As Integer
     Dim iMin As Integer
     
     Dim iTmax As Integer
     
     Dim bMemo() As Variant
     Dim Nb As Long
     Dim k As Integer
     iMax = 10
     iMin = 0
     ReDim bMemo(iMin To iMax)
     
     For k = iMin To iMax
       bMemo(k) = k
     Next
     
     Randomize
     iTmax = UBound(bMemo)
     While iTmax >= 0
     
        Nb = Int((UBound(bMemo) + 1) * Rnd + iMin)
         Debug.Print bMemo(Nb)
         If UBound(bMemo) > 0 Then
             EffaceElement Nb, bMemo
               iTmax = UBound(bMemo)
           Else
            iTmax = -1
           End If
          DoEvents
         Wend
    End Sub

  12. #12
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    C'est quoi le but - Trouver la solution la plus longue ou la plus tordue ?

  13. #13
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Citation Envoyé par DarkVader
    C'est quoi le but - Trouver la solution la plus longue ou la plus tordue ?
    ben je sais pas j'ai du choisir la solution la plus longue et toi la plus tordue :





    sinon il faudrai revoir ton code pour le cas ou la fonction aleatoire renvoi NB =0 ?

    Citation Envoyé par DarkVader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
        tmp = "AA,AB,ACK,BC,CB,GH,HIO,JK,LM,MO,": a = UBound(Split(tmp, ","))
       ...
     tmp = Replace(tmp, "," & b & ",", ",")
    ..

  14. #14
    Membre expérimenté
    Avatar de Linaa
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    987
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 987
    Points : 1 309
    Points
    1 309
    Par défaut
    Citation Envoyé par bbil
    sinon il faudrai revoir ton code pour le cas ou la fonction aleatoire renvoi NB =0 ?

    Citation Envoyé par DarkVader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
        tmp = "AA,AB,ACK,BC,CB,GH,HIO,JK,LM,MO,": a = UBound(Split(tmp, ","))
       ...
     tmp = Replace(tmp, "," & b & ",", ",")
    ..
    En effet, si nb vaut 0, le split ne fera rien
    Pour la soustraire, il faudrait faire un b = Mid(tmp, 1, 2)
    Ensuitre re-tester nb pour faire le replace tmp = Replace(tmp, b & ",", "")

    Sinon je vais opter pour la solution avec le tableau de booleen qui est la plus simple à mon avis !

    Merci à tous !

  15. #15
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Citation Envoyé par bbil
    .../...
    sinon il faudrai revoir ton code pour le cas ou la fonction aleatoire renvoi NB =0 ?

    Citation Envoyé par DarkVader
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
        tmp = "AA,AB,ACK,BC,CB,GH,HIO,JK,LM,MO,": a = UBound(Split(tmp, ","))
       ...
     tmp = Replace(tmp, "," & b & ",", ",")
    ..
    Exact, j'ai répondu un peu vite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Dim NB As Integer, ret(), k As Integer
        Dim tmp As String, a As Integer, b As String
     
        tmp = "AA,AB,ACK,BC,CB,GH,HIO,JK,LM,MO,GHJ,KLM,": a = UBound(Split(tmp, ","))
        ReDim ret(0 To a - 1)
     
        Randomize
     
        Do
            NB = CInt(Int(((a - k) * Rnd()))): b = Split(tmp, ",")(NB): ret(k) = b
            k = k + 1:  tmp = Replace(tmp, IIf(NB <> 0, ",", "") & b & ",", IIf(NB <> 0, ",", ""))
        Loop Until k = a

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. p'tite question de cryptage ( nombre aléatoire )
    Par smyley dans le forum Algorithmes et structures de données
    Réponses: 53
    Dernier message: 08/11/2004, 10h07
  2. Nombres aléatoires
    Par Mat 74 dans le forum Assembleur
    Réponses: 20
    Dernier message: 29/08/2004, 13h31
  3. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20
  4. Nombre aléatoire en SQL
    Par sqlnet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 19/08/2003, 12h38
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo