Clé qui ouvre une porte

Bonjour

j'ai une petite question concernant un probleme de math ... le voici :

on dispose d'un trousseau de 25 clés , une seule clé permet d'ouvrir la porte , on fait donc de multiples tentativesavec une clé choisie au hasard et on arrete lorsque la porte est ouverte .Pour cela j'ai redigé le bout de code suivant mais je suis un peu etonné de ce qu'il me retourne

'25 clés dont une seule ouvre la porte

p = 14 'position de la clé qui ouvre dans le trousseau

For k = 1 To 25 ' ici je fais au maximum 25 essais d'ouvertures

If Int(Rnd * 25) + 1 = p Then je génère une valeur de position d'une clé dans le trousseau et si c'est la 14 alors je sors de la boucle

GoTo 1

End If

Next

1: MsgBox k & " essais" ' ici apres quelques essais le programme me retourne la valeur 0 or k est compris entre 1 et 25 ..je ne comprend pas

End Sub

Merci pour vos suggestions

Bonjour,

Une piste avec un dictionnaire pour des tirages uniques et sortie de boucle si le tirage correspond à la clé (P) :

Sub ClePorte()

    Dim Dico As Object
    Dim Cle As Variant
    Dim I As Integer
    Dim R As Integer
    Dim P As Integer

    P = 14

    Randomize

    Set Dico = CreateObject("Scripting.Dictionary")

    Do

        R = Int((25 * Rnd) + 1)
        Dico(R) = R
        If R = P Then Exit Do

    Loop While Dico.Count < 25

    Cle = Dico.Keys

    'résultat dans la fenêtre d'exécution (ctrl+G)
    For I = 0 To Dico.Count - 1: Debug.Print Cle(I): Next I

End Sub

Merci pour cette réponse Theze .. je vais me pencher sur l'utilisation des dictionnaires du coup

finalement c'est une notion qui est semble à celle des tableaux avec laquelle j'ai deja l' habitude de travailler ...tableau ou dico c'est pareil finalement ...une question cependant comment remplir un dictionnaire , pour obtenir l'equivalent de ceci au niveau tableau :

T =array("vert","jaune ",rouge","bleu" , "marron" ,"orange", "noir")

faut il ecrire systematiquement

MonDico.Add 1, "vert"

MonDico.Add 2, "jaune"

MonDico.Add 3, "rouge"

ect.... ?

Merci

Bonjour,

Effectivement, un dictionnaire est un tableau à deux dimensions dont la première est la clé et la seconde, la valeur liée à cette clé mais la différence entre un tableau et un dictionnaire réside dans le fait que le dictionnaire n'accepte que les valeurs uniques dans les clés un peu comme une collection, c'est pour cette raison qu'il est souvent utiliser pour dédoublonner.

Pour remplir un dictionnaire, tu peux faire comme tu as montré :

MonDico.Add 1, "vert"
MonDico.Add 2, "jaune"
MonDico.Add 3, "rouge"

où les trois chiffres sont les clés et les noms des couleurs sont les valeurs des clés mais tu peux aussi utiliser les noms des couleurs comme clés :

MonDico.Add "vert", "vert"
MonDico.Add "jaune", "jaune"
MonDico.Add "rouge", "rouge"

tu peux donc utiliser la méthode Add de façon explicite comme ci-dessus mais tu peux aussi l'utiliser de façon implicite comme ceci car si la clé n'existe pas, elle est automatiquement créée :

MonDico(1) = "vert"
MonDico(2) = "jaune"
MonDico(3) = "rouge"

ou :

MonDico("vert") = "vert"
MonDico("jaune") = "jaune"
MonDico("rouge") = "rouge"

Pour balayer la collection de clés ou/et de valeurs, tu peux faire comme ci-dessous en déclarant Cle et Valeur comme Variant :

Sub Test()

    Dim MonDico As Object
    Dim Cle
    Dim Valeur
    Dim I As Integer

    Set MonDico = CreateObject("Scripting.Dictionary")

    MonDico.Add 1, "vert"
    MonDico.Add 2, "jaune"
    MonDico.Add 3, "rouge"

    Cle = MonDico.Keys
    Valeur = MonDico.Items

    For I = 0 To MonDico.Count - 1

        Debug.Print "la clé est : "; Cle(I); ", la valeur de cette clé est : "; Valeur(I)

    Next I

End Sub

Dans un dictionnaire, tu peux modifier la valeur de la clé directement :

MonDico(3) = "marron"

tu peux exécuter des concaténations ou des calculs :

MonDico(2) = MonDico(2) & "," & MonDico(1)

MonDico.Add 1, 10
MonDico.Add 2, 20
MonDico.Add 3, 30

MonDico(2) = MonDico(2) * MonDico(1)

Tu peux même stocker des objets dans un dictionnaire comme par exemple des cellules (contrôlé ici avec TypeName) :

Sub Test()

    Dim MonDico As Object
    Dim Cle
    Dim Valeur
    Dim I As Integer

    Set MonDico = CreateObject("Scripting.Dictionary")

    MonDico.Add Range("A1"), Range("A1").Value
    MonDico.Add Range("A2"), Range("A2").Value
    MonDico.Add Range("A3"), Range("A3").Value

    Cle = MonDico.Keys
    Valeur = MonDico.Items

    For I = 0 To MonDico.Count - 1

        Debug.Print "la clé est un : "; TypeName(Cle(I)); ", la valeur de cette clé est : "; Valeur(I)

    Next I

End Sub

Un grand Merci pour ces explications Theze, j ai la un cours complet sur la notion de dictionnaire.. Royale !

Merci, heureux de t'avoir aidé

Rechercher des sujets similaires à "cle qui ouvre porte"