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

C# Discussion :

Random identiques ?!


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Par défaut Random identiques ?!
    Bonjour a tous,
    Je developpe un petit programme (tres basique) qui n'a pour but que de generer des mots de passe aleatoire formes par une combinaison de chiffres et/ou de lettres (majuscules et minuscules). Le probleme est que je ne genere que des chiffres (ou lettres) identiques. Je ne comprends pas mon erreur.
    Pour la partie GUI, j'ai une fenetre avec 3 checkbox, une listbox(pour la taille du mot de passe) un bouton pour generer le mdp et un text area.
    Lorsqu'on clique sur le bouton, voici ce que je fais :
    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
    if (auMoinsUnChoix()) {
        liste.Clear();
        errorLabel.Text = "";
        if (chiffres.Checked) liste.Add(carChiffre);
        if (lettresMinuscules.Checked) liste.Add(carLettreMin);
        if (lettresMajuscules.Checked) liste.Add(carLettreMaj);
        Random r = new Random(unchecked((int)DateTime.Now.Ticks));
        string code = "";
        for(int i=0; i<longueurMdp.Value; i++) {
          code = 	((Caractere)liste[r.Next(0, liste.Count-1)]).AjouterCaractere(code);
        }
        resultatBox.Text = code;
    }else{
      errorLabel.Text = "Erreur : aucun type de caractères choisi";
    }
    Je suis au courant que c'est tres mal code... manque de pattern (entre autre MVC) mais je voulais qq chose de rapide. C'est pour mon usage perso. Donc du moment que je m'y retrouve !
    Ensuite j'ai une interface Caractere et deux classes Chiffre et Lettre
    Vous avez compris leur utilite :
    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
    public interface Caractere {
      string AjouterCaractere(string chaine);
    }
     
    public class Chiffre : Caractere {
      public string AjouterCaractere(string chaine) {
        Random r = new Random(unchecked((int)DateTime.Now.Ticks));
        return chaine + (r.Next(0, 9)).ToString();
      }
    }
     
    public class Lettre : Caractere {
      private bool minuscule;
      public Lettre(bool minuscule) { this.minuscule = minuscule; }
      public string AjouterCaractere(string chaine) {
        Random r = new Random(unchecked((int)DateTime.Now.Ticks));
        int offset = r.Next(0, 25);
        Console.WriteLine("lettre : " + offset);
        char c = ' ';
        if (minuscule) c = (char)('a' + offset);
        else c = (char)('A' + offset);
        return chaine + c;
      }
    }
    Qu'en pensez vous? Je ne trouve pas l'erreur... c'est assez genant. De plus, quand je fais du debugging, je trouve un chiffre (ou lettre) chaque fois different... mais pas quand j'execute simplement le programme.

  2. #2
    Membre éprouvé Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Par défaut
    ceci te guidera peut-être

    http://www.obviex.com/Samples/Password.aspx

  3. #3
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Déjà tu n'as pas besoin d'indiquer le seed pour créer ton objet Random, le constructeur par défaut se base sur le temps et c'est bien suffisant en règle générale

    Ensuite, les appels à chaque AjouterCaractere sont très rapides, résultat le seed du random n'a pas forcément changé d'un appel à l'autre et, au final, les mêmes caractères ressortent.

    Le plus simple est d'ajouter une petite pause (avec Thread.Sleep) pour s'assurer que le seed sera différent à la génération suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0; i < longueurMdp.Value; i++) 
    {
        code = ((Caractere)liste[r.Next(0, liste.Count-1)]).AjouterCaractere(code);
        Thread.Sleep(1);
    }

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Par défaut
    Ca serait donc ca?!
    Je vais essayer tout de suite

  5. #5
    Membre confirmé
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Par défaut
    SUPER ! Merci beaucoup, ca vient de la le probleme. J'ai essaye Sleep(1) mais c'est tres peu. 10 ms c'est encore trop peu. 20 c'est bon. Le probleme evidement c'est que plus le mdp sera long plus ca va prendre du temps. Enfin, c'est encore raisonnable. Je vais p-e rajouter une barre de progression, histoire de montrer que le programme est toujours actif.
    Merci en tout cas !

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Si le temps peut poser un problème, débrouille toi pour n'avoir qu'un seul objet Random à tout moment pour ton traitement, comme ca plus de problème

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

Discussions similaires

  1. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47
  2. [VB6] : pour faire un Randomize sous vb... merci
    Par delnic dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/01/2003, 15h49
  3. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57
  4. balises identiques
    Par Phmichel dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 28/10/2002, 09h18
  5. Random en Assembleur
    Par funx dans le forum Assembleur
    Réponses: 9
    Dernier message: 02/09/2002, 17h05

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