Je veux générer une chaîne aléatoire de 5 car dont les caractères peuvent être des chiffres ou des Lettres en Majuscules.
cordialement
Je veux générer une chaîne aléatoire de 5 car dont les caractères peuvent être des chiffres ou des Lettres en Majuscules.
cordialement
Sans faire dans la finesse, je peux te proposer ca:
+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public String generate(int length) { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; // Tu supprimes les lettres dont tu ne veux pas String pass = ""; for(int x=0;x<length;x++) { int i = (int)Math.floor(Math.random() * 62); // Si tu supprimes des lettres tu diminues ce nb pass += chars.charAt(i); } System.out.println(pass); return pass; }
Bon y a surement mieux mais bon :
tu prends un tableau de char "abcd ... xyz"
Un random number et tu accedes 5 fois ton tableau.
Mais je suis certain qu'il existe des fonctions toutes faites
On a été plus rapide et plus clair que moi![]()
Sorry
Tiens... ici
Pret à l'emploi...![]()
il n'y a pas moyen de passer par l'unicode ??
merci c résolu ja imodi un peu pour répondre à mon besoin
Pour optimiser:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public String generate(int length) { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; // Tu supprimes les lettres dont tu ne veux pas String pass = ""; for(int x=0;x<length;x++) { int i = (int)Math.floor(Math.random() * chars.length() -1); // Si tu supprimes des lettres tu diminues ce nb pass += chars.charAt(i); } System.out.println(pass); return pass; }
Pour optimiser et corriger un bug:
Remarque si la méthode n'est pas static, vous pouvez remplacer le StringBuffer par un StringBuilder.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public static String generate(int length) { String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; StringBuffer pass = new StringBuffer(); for(int x=0;x<length;x++) { int i = (int)Math.floor(Math.random() * (chars.length() -1)); pass.append(chars.charAt(i)); } return pass.toString(); }
Les parenthèse sont obligatoire car si rand tire pa exemple un nombre tel 0.00001, le floor retourné sera -1... outofrangeException
désolé de remonter ce sujet mais il sort avec la recherche google, et je cherchais s'il existait des solutions toute faite.
C'est pas une question de static ou pas. Static ou pas, ici le StringBuffer n'est pas réutilisé d'un appel à l'autre, donc il vaut mieux utiliser un StringBuilder.
En fait, c'est assez rare qu'on puisse se permettre de partager un StringBuffer d'un appel à l'autre, donc, presque toujours, il faut faire les choses de sorte qu'il vaille mieux un StringBuilder.
désolé de remonter ce sujet mais il sort avec la recherche google, et je cherchais s'il existait des solutions toute faite.simplifie déjà pas mal les choses. Mais je n'ai pas connaissance d'un algo intégré à la bibliothèque de base pour faire une chaîne de caractères aléatoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int nbChars = chars.length(); ... Random.nextInt(nbChars);
Il est bien sûr préférable d'utiliser StringBuffer/StringBuilder à la place de l'opérateur +, mais comme indiqué par thelvin, dans ce code il n'y a aucune raison d'utiliser un StringBuffer en particulier, puisqu'on manipule une variable locale qui n'est en aucun cas partagée avec un autre thread.
En fait il ne faut pas du tout enlever -1 à la taille du tableau.
Math.random() renvoi toujours un nombre inférieur à 1.0, donc Math.random() * chars.length() renvoi forcément un nombre inférieur à la taille du tableau. Si on fait le -1 le dernier caractère ne pourra jamais être tiré...
De plus le Math.floor() est inutile puisque derrière on caste en int, ce qui aura pour conséquence de "perdre" les décimales...
Une dernière optimisation mineure serait d'initialiser le StringBuilder avec la taille de la chaine finale, puisqu'on la connait (cela peut permettre d'éviter quelques redimensionnement automatique du buffer).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public static String generate(int length) { String chars = "a"; StringBuilder pass = new StringBuilder(length); for (int x = 0; x < length; x++) { int i = (int) (Math.random() * chars.length()); pass.append(chars.charAt(i)); } return pass.toString(); }
nextInt() n'est pas static, et il faut créer une instance de Ramdom pour l'utiliser. Ce n'est pas forcément plus pratique...
a++
Partager