Delioneras
Messages postés3Date d'inscriptionvendredi 17 novembre 2006StatutMembreDernière intervention12 avril 2010
-
28 mai 2007 à 15:08
Delioneras
Messages postés3Date d'inscriptionvendredi 17 novembre 2006StatutMembreDernière intervention12 avril 2010
-
28 mai 2007 à 19:05
Bonjour à tous.
Etudiant en 2eme année de BTS IG, spécialité développeur, je suis en train de fignoler une de mes applications, dans laquelle je dois, notamment, générer des mots de passe aléatoirement.
J'ai trouvé quelques sources un peu partout (un tableau de 62 caractères [a-z]/[0-9]/[A-Z], et le system.random)
Mon problème est que ce générateur me génère un seul caractère, répété plusieurs fois pour former une chaine.
Si j'enserre un msgbox pour vérifier le texte généré, cela me sort bien une succession aléatoire, mais dès lors que j'enlève ce msgbox (par un simple ' de commentaire), ma fonction renvoie Xfois le même caractère, ce qui me gène beaucoup.
Voici mon code de test, la region "V1" comprend le msgbox de vérification, alors que la region "V2" n'en tient pas compte. En dehors de ce petit caractère, le code est strictement identique.
----------------------------------------------------------------------------------------------------
Public Class Form1
#Region "V1"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button1.Click
'Dim MDPGenere As String If TextBox1.Text "" Or IsNumeric(TextBox1.Text) False Then
MsgBox("remplir la textbox")
TextBox1.Focus()
Else
TextBox2.Text = GenMDP()
'MDPGenere = GenMDP()
'MsgBox(MDPGenere)
End If
End Sub
Private Function GenMDP() As String
Dim TableauCarac() As String = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t" _
, "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", _
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
Dim TexteGenere As String = ""
For i As Integer = 1 To CInt(TextBox1.Text)
'If i > CInt(TextBox1.Text) Then
'GenMDP = TexteGenere
'End If
Dim Rnd As New System.Random
Dim index As Integer = Rnd.Next(0, 61)
TexteGenere = TexteGenere & TableauCarac(index).ToString
MsgBox(TexteGenere)
Next i
'MsgBox(TexteGenere)
GenMDP = TexteGenere
End Function
#End Region
#Region "V2"
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles Button2.Click
'Dim MDPGenere As String If TextBox3.Text "" Or IsNumeric(TextBox3.Text) False Then
MsgBox("remplir la textbox")
TextBox3.Focus()
Else
TextBox4.Text = GenMDP2()
'MDPGenere = GenMDP()
'MsgBox(MDPGenere)
End If
End Sub
Private Function GenMDP2() As String
Dim TableauCarac() As String = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t" _
, "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", _
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
Dim TexteGenere As String = ""
For i As Integer = 1 To CInt(TextBox3.Text)
'If i > CInt(TextBox1.Text) Then
'GenMDP = TexteGenere
'End If
Dim Rnd As New System.Random
Dim index As Integer = Rnd.Next(0, 61)
TexteGenere = TexteGenere & TableauCarac(index).ToString
'MsgBox(TexteGenere)
Next i
'MsgBox(TexteGenere)
GenMDP2 = TexteGenere
End Function
#End Region
End Class
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 28 mai 2007 à 18:31
Salut
Par curiosité, j'ai copier coller ton premier code et Text2 reçoit bien une chaine dite "aléatoire".
Par contre, c'est vrai, dans la deuxième, les caractères sont identiques.
Cela est dû au fait que la 2eme n'a pas de MsgBox pour créer artificiellement une pause.
De ce fait, la fonction Random génère donc toujours le même index puisqu'elle est réinitialisée à chaque caractère.
Il te suffit donc de déplacer la ligne suivante juste avant le FOR :
Dim
Rnd
As
New System.Random
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on
Delioneras
Messages postés3Date d'inscriptionvendredi 17 novembre 2006StatutMembreDernière intervention12 avril 2010 28 mai 2007 à 19:05
Hello Jack
Merci pour la réponse.
Je suis arrivé à la même conclusion en étudiant le code qu'a fait un pote en remplaçant le for par un do while: la succession des déclarations fait qu'il crée plusieurs objets de type system.random, et qu'il n'avait effectivement pas le temps de changer d'objet avant de réalimenter ma variable.
Seulement, j'ai conclu ça environ 3h30 après avoir posté sur le forum (ou comment perdre du temps pour presque rien -_-).
En tout cas merci pour la réponse, c'était bien là le problème.