Un générateur qui génère pas correctement

Résolu
Delioneras Messages postés 3 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 12 avril 2010 - 28 mai 2007 à 15:08
Delioneras Messages postés 3 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 12 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

----------------------------------------------------------------------------------------------------

Je m'en remet donc à vous si vous pouvez m'aider à trouver pourquoi la V2 coince.

Merci d'avance,
Cordialement,
Delioneras

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 78
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
3
Delioneras Messages postés 3 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 12 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.

Delioneras
3
Rejoignez-nous