Generer aleatoirement un caractère à partir d'un tableau

Generer aleatoirement un caractère à partir d'un tableau - Java - Programmation

Marsh Posté le 30-08-2009 à 21:30:02    

Bonsoir à tous.
Je tente de générer un mot de passe à partir de caractères sélectionnés aléatoirement dans un tableau. Cependant, la fonction Random ne prend pas le type char en paramètre. Si quelqu'un peut m'aider, merci beaucoup ... Voici le code :  
 

Code :
  1. Random r = new Random();
  2.        String motPasse = null;
  3.        char [] tableauLettres = {'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'};
  4.        int [] tableauChiffres = {0,1,2,3,4,5,6,7,8,9};
  5.        char [] tableauCaracteres = {'@','-','#','_','!'};
  6.            
  7.            // sélectionne au hasard un indice dans le tableau
  8.            int mpChiffre = r.nextInt(tableauChiffres.length);
  9.            System.out.println(mpChiffre);
  10.            // retourne le nombre correspondant à cette indice
  11.            mpChiffre = tableauChiffres[mpChiffre];
  12.            System.out.println(mpChiffre);
  13.  
  14.            char mpLettres = r.nextInt(tableauLettres.length);
  15.            System.out.println(mpLettres);
  16.            mpLettres = tableauChiffres[mpLettres];
  17.            System.out.println(mpLettres);


Message édité par JFC31 le 30-08-2009 à 21:30:47
Reply

Marsh Posté le 30-08-2009 à 21:30:02   

Reply

Marsh Posté le 31-08-2009 à 09:01:00    

- Pourquoi veux-tu passer un char à la "fonction Random" ?
- Ton nextInt te renvoie l'indice dans le tableau, par la valeur à cet indice. C'est pourtant bien commenté dans ton code. Tu as repris du code que tu ne comprends pas?
- Il y a qq chose d'horrible dans ta déclaration de tableauLettres et tableauChiffres.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 31-08-2009 à 14:39:28    

c'est ok ça marche. Merci sircam
Qu'est ce qui est horrible dans ma déclaration ?

Reply

Marsh Posté le 31-08-2009 à 17:52:24    

C'est sûr mais il faut un mot de passe de 6 caractères avec 2 lettres, 2 chiffres et 2 caractères ...

Reply

Marsh Posté le 31-08-2009 à 18:30:44    

Je récupère 2 lettres, 2 chiffres et 2 caractères que je dois ensuite placer dans un tableau de caracteres mais je n'arrive pas à les mettre dans le tableau :

Code :
  1. Random r = new Random();
  2.        String motPasse = null;
  3.        char [] tableauChiffres = {'0','1','2','3','4','5','6','7','8','9'};
  4.        //int [] tableauChiffres = {0,1,2,3,4,5,6,7,8,9};
  5.        char [] tableauLettres = {'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'};
  6.        char [] tableauCaracteres = {'@','-','#','_','!'};
  7.        char [] constructionMP = new char [6];
  8.        char mpChiffre = ' ';
  9.        
  10.            for (int i = 0; i < 2; i++){
  11.                
  12.                // ON RECUPERE UN CHIFFRE
  13.                // sélectionne au hasard un indice dans le tableau
  14.                int indiceChiffre = r.nextInt(tableauChiffres.length);
  15.                System.out.print("-chiffre : "+indiceChiffre+" => " );
  16.                // retourne le nombre correspondant à cette indice
  17.                mpChiffre = tableauChiffres[indiceChiffre];
  18.                System.out.println(mpChiffre);
  19.                
  20.                // ON RECUPER UNE LETTRE
  21.                int indiceLettre = r.nextInt(tableauLettres.length);
  22.                System.out.print("-lettre : "+indiceLettre+" => " );
  23.                char mpLettre = tableauLettres[indiceLettre];
  24.                System.out.println(mpLettre);
  25.                
  26.                // ON RECUPERE UN CARACTERE
  27.                int indiceCaractere = r.nextInt(tableauCaracteres.length);
  28.                System.out.print("-caractere : "+indiceCaractere+" => " );
  29.                char mpCaractere = tableauCaracteres[indiceCaractere];
  30.                System.out.println(mpCaractere);
  31.        
  32.             }

Reply

Marsh Posté le 31-08-2009 à 20:53:45    

JFC31 a écrit :

Qu'est ce qui est horrible dans ma déclaration ?


Tu a écris tout l'alphabet. Une boucle sur chacune des lettres serait :
 

  • Plus élégante
  • Moins sujette à erreur : si tu oublies une lettre, ou que tu la répètes, ton programme donnera un résultat erroné.


Imagine que tu doive déclarer une telle suite non pas de 26 lettres mais de 10.000 caractères qui se suivent... Tu serais bien embêté. Bien sûr, on peut pousser le vice assez loin. Mais pour moi, les 10 chiffres, c'est déjà de trop! L'informaticien est naturellement paresseux.  [:dawa]  
 


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 05-09-2009 à 21:47:22    

JFC31, j'ai 2 questions:
 
1) Tu dis qu'il faut 2 lettres, 2 chiffres et 2 caractères spéciaux, mais doivent-il se trouver dans un ordre précis? Si non, ton programme n'en tient pas compte car il les génère toujours dans le même ordre.
2) Les lettres doivent elles être uniquement en minuscule ou bien majuscules ou minuscules au choix?
 
Pour les lettres et les chiffre, je n'utiliserais pas de tableau de lettres ou de chiffres qui ne sert à rien sauf si tu veux exclure certaines lettres ou certains chiffres. Et pas besoin de faire des boucles d'initialisation non plus.
 
Voilà comment je l'écrirais:
 

Code :
  1. // Générer une lettre aléatoire en minuscule
  2. char c = (char)((int)'a' + r.nextInt(26));


 

Code :
  1. // Générer un chiffre aléatoire
  2. char c = (char)((int)'0' + r.nextInt(10));


Message édité par cbeyls le 05-09-2009 à 21:50:36
Reply

Marsh Posté le 06-09-2009 à 00:53:48    

Voici un générateur de mot de passe de 6 caractères dont 2 lettres minuscules, 2 chiffres et 2 caractères spéciaux.
Les caractères sont mélangés dans un ordre quelconque.
 

Code :
  1. public class GenerateurMDP {
  2.     
  3.     public static final int        NOMBRE_LETTRES    = 26;
  4.     public static final int        NOMBRE_CHIFFRES    = 10;
  5.     public static final char[]    CARACTERES        = {'@','-','#','_','!'};
  6.     public static final Random    R                = new Random();
  7.     
  8.     public static String getMDP() {
  9.         char[] mdp = new char[6];
  10.         
  11.         // Génère les caractères aléatoires
  12.         int j = 0;
  13.         for (int i = 0; i < 2; ++i) {
  14.             // Assigne une lettre minuscule aléatoire
  15.             mdp[j++] = (char)((int)'a' + R.nextInt(NOMBRE_LETTRES));
  16.             // Assigne un chiffre aléatoire
  17.             mdp[j++] = (char)((int)'0' + R.nextInt(NOMBRE_CHIFFRES));
  18.             // Assigne un caractère aléatoire
  19.             mdp[j++] = CARACTERES[R.nextInt(CARACTERES.length)];
  20.         }
  21.         
  22.         // Mélange les caractères
  23.         char temp;
  24.         for (int i = mdp.length; i > 0;) {
  25.             j = R.nextInt(i);
  26.             --i;
  27.             temp = mdp[i];
  28.             mdp[i] = mdp[j];
  29.             mdp[j] = temp;
  30.         }
  31.         
  32.         return new String(mdp);
  33.     }
  34.     
  35.     public static void main(String[] args) {
  36.         System.out.println(getMDP());
  37.     }
  38. }


 
Si tu souhaites que les lettres soient en majuscules OU en minuscules, modifie les lignes suivantes:
 

Code :
  1. // Assigne une lettre minuscule aléatoire
  2.             mdp[j++] = (char)((int)'a' + R.nextInt(NOMBRE_LETTRES));


comme ceci:

Code :
  1. // Assigne une lettre aléatoire
  2.             mdp[j++] = (char)((int)(R.nextBoolean() ? 'a' : 'A') + R.nextInt(NOMBRE_LETTRES));

Reply

Marsh Posté le 05-01-2013 à 20:34:35    


 
la fonction Random ne prend pas la valeur des elements  de votre tableau mais elle prend l'indice de ses valeurs ,alors si tu voudras afficher  le caractère sélectionnée aléatoirement tu doit ecrire : System.out.println(tableauLettes[mpLettres]); ok ;)
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed