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 SubMerci 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 SubDans 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 SubUn grand Merci pour ces explications Theze, j ai la un cours complet sur la notion de dictionnaire.. Royale !
Merci, heureux de t'avoir aidé