Salut,
Je voudrais obtenir une chaine aléatoire comme "DF56D" ou "6ke23" (combiné entre les chiffres et les lettres , sans casse particulière).
Merci par avance de votre aide.
Version imprimable
Salut,
Je voudrais obtenir une chaine aléatoire comme "DF56D" ou "6ke23" (combiné entre les chiffres et les lettres , sans casse particulière).
Merci par avance de votre aide.
Salut,
Bon une solution un peu moche mais pourquoi pas :
Code:
1
2
3
4
5
6
7
8
9
10
11 // tu précises ici tous les caractères que tu souhaites avoir au hasard char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray(); StringBuilder sb = new StringBuilder(); Random random = new Random(); // Exemple d'une chaine aléatoire de 20 caractères for (int i = 0; i < 20; i++) { char c = chars[random.nextInt(chars.length)]; sb.append(c); } String output = sb.toString();
Salut,
Tout d'abord, pour générer n'importe quoi d'aléatoire, on peut utiliser la classe Random (ou ThreadLocalRandom.current() qui une instance déjà créée pour chaque thread). On va à l'aide de cette classe tirer des caractères aléatoirement.
Pour construire la chaîne, de préférence utiliser un StringBuilder qui va permettre de concaténer chaque caractère l'un après l'autre.
On aura donc un canevas de ce type :
Les caractères en Java sont représentés par des valeurs de type char : en Java, ce type peut être mappé sur le type int (à chaque caractère correspond un int, pour les lettres et les chiffres, il s'agit du code ASCII). Il suffit de caster pour obtenir un char.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Random random = ThreadLocalRandom.current(); int tailleChaine = random.nextInt(1, TAILLE_MAX_DE_CHAINE); // on tire la taille de la chaîne entre 1 et une constante qui définira la taille maximum de la chaîne (que tu dois déclarer bien sûr). Tu peux aussi mettre une valeur en dur, par exemple int tailleChaine = 5; StringBuilder stringBuilder = new StringBuilder(tailleChaine); // on crée une instance de StringBuilder avec un buffer de la taille de la chaîne (qu'on connait) for(int i=0; i<tailleChaine; i++) { char c = /** ici un code pour générer un caractère aléatoire (type char) **/ stringBuilder.append( c ); // on concatène le caractère } String chaineAleatoire = stringBuilder.toString();
On peut donc écrire :
Il faut bien sûr que nextInt() tire un nombre qui fait partie de l'intervalle que tu désires, celui donc qui comprend les lettres minuscules, les lettres majuscules, les chiffres. Ce serait très simple si les codes ASCII de ces caractères étaient contigus, puisqu'il suffirait d'écrire :Code:char c = (char)random.nextInt();
Mais ils ne le sont pas, malheureusement. Le moyen le plus simple de s'en sortir à mon avis est de construire un tableau avec tous les caractères voulus et de faire un tirage dans ce tableau.Code:char c = (char)random.nextInt(premierCode, dernierCode+1); // la méthode tire un int entre le premier nombre inclus et le dernier exclu
Ainsi si on a un tableau comme ça :
On peut écrire :Code:char[] tableau = /** définition du tableau **/
On pourrait remplir le tableau à la main, mais ce serait fastidieux : on va le remplir automatiquement, avec trois boucles for (on peut incrémenter un char, comme on incrémente un int, à cause du mapping dont j'ai déjà parlé) :Code:char c = tableau[random.nextInt(tableau.length)]; // on n'a pas besoin de mettre le premier paramètre lorsqu'il vaut 0
Code:
1
2
3
4
5
6
7
8
9
10
11 char[] tableau = new char[26 + 26 + 10]; // on prévoit la place pour 26 lettres x 2 + 10 chiffres int i=0; for(char c='a'; c<='z'; c++, i++) { // on remplit avec les minuscules tableau[i] = c; } for(char c='A'; c<='Z'; c++, i++) { // on remplit avec les majuscules tableau[i] = c; } for(char c='0'; c<='9'; c++, i++) { // on remplit avec les chiffres tableau[i] = c; }