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++
un petit calcul en base 36 (MAX_RADIX) ne vous tente pas?
quel est le plus petit nombre de 5 caractères en base 36 (soit N) quel est le plus grand (M).
avec Random tirer au hasard nextint(M-N) rajouter N
et transformer en base 36.
non?
Si. C'est pas mal niveau opti et niveau random.
(Par contre, question clarté ça le fait un peu moins, mais bon...)
par exemple?
(bon les bornes ne sont pas correctes - il faut partir de "10000" - mais c'est l'idée)
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 public class RandomString5 { static final int MIN = Integer.parseInt("11111", 36) ; static final int MAX = Integer.parseInt("ZZZZZ", 36) ; static final int DIFF = MAX - MIN ; Random tireur = new Random() ; public String getNextString() { int val = tireur.nextInt(DIFF); val+= MIN ; return Integer.toString(val ,36); } public static void main(String[] args) { RandomString5 rd = new RandomString5() ; for(int ix = 0 ; ix <20 ; ix++){ System.out.println(rd.getNextString()); } } }
rebonjour
hé bien je ne pensais que mon déterrage donnerai lieu à des commentaires aussi instructifs
merci pour toutes ces remarques
Par contre je n'ai pas compris la proposition de professeur shadoko ^^
Proposition de code tenant compte des remarques
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 private static String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; private static int charLength = chars.length(); public static String generateString(int length) { StringBuilder pass = new StringBuilder (charLength); for (int x = 0; x < length; x++) { int i = (int) (Math.random() * charLength); pass.append(chars.charAt(i)); } return pass.toString(); }
Cela consiste à utiliser la base 36 pour afficher un nombre.
En base 36 on utilise les 10 chiffres + les 26 lettres de l'alphabet pour représenter un nombre.
C'est une solution viable mais moins pratique à mon avis...
A mon avis il n'y a aucun intérêt à utiliser des attributs static (à moins de la réutiliser dans une autre méthode)... autant tout laisser dans le code de la méthode.
a++
[edit] (ajout d'une remarque)
Ce n'est pas une critique hein (au contraire je trouve cela plutôt astucieux)
C'est tout à fait adapté à la demande originale, mais si on veut un truc un peu plus générique cela n'est pas forcément adapté :
- On n'a pas vraiment de contrôle sur les caractères utilisés.
Par exemple pour un générateur de mot de passe, on pourrait vouloir supprimer les caractères I et O, visuellement trop proche de 1 et 0. On pourrait également vouloir ajouté des caractères spéciaux...- La taille de la chaine générée est fixé en dur dans le code. Si on veut quelque chose de plus variable c'est nettement moins pratique (il faudrait régénérer MIN et MAX à partir de chaines générées dynamiquement).
- De plus tel quel on est limité à 6 caractère max (Integer.MAX_VALUE en base 36 => "zik0zj"). Et on ne monte qu'à 13 en utilisant des Long...
Si on veut plus long il faut passer par des concaténations.
Bref, cela répond exactement à la demande originale, mais ce n'est pas forcément la manière la plus souple
a++
Je sais pertinemment que cette discussion est résolue mais je me permet de vous faire partager un code que j'ai mis en place et qui s'inspire de vos idées.
Certes le code est en c# mais la migration en java est très simple.
voici le code pour générer une chaîne aléatoire:
cordialement,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 string caracteres ="²12345MWXCVBN67890°+&é'(-è_azertyuiçà)=~#{[|`\\opqsdf^@]}¤¨£%µghjklm§/.?<>AZERTwxcYUIOPQSDvbnFGHJKL"; Random selAlea = new Random(); string sel=""; for (int i = 0; i < 8; i++) { sel += caracteres[ selAlea.Next(0,caracteres.Length)]; } return sel;
Klivor
Partager