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 :
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(); |
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.
On peut donc écrire :
char c = (char)random.nextInt();
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 :
char c = (char)random.nextInt(premierCode, dernierCode+1); // la méthode tire un int entre le premier nombre inclus et le dernier exclu
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.
Ainsi si on a un tableau comme ça :
char[] tableau = /** définition du tableau **/
On peut écrire :
char c = tableau[random.nextInt(tableau.length)]; // on n'a pas besoin de mettre le premier paramètre lorsqu'il vaut 0
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é) :
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;
} |
Partager