Comment générer une chaîne aléatoire en Java

J’ai un object appelé Student et il a studentName , studentName , studentName , etc. Pour studentId , je dois générer des chaînes aléatoires composées de sept caractères numériques, par exemple.

 studentId = getRandomId(); studentId = "1234567" <-- from the random generator. 

Et je dois m’assurer qu’il n’y a pas d’identifiant en double.

Générer une chaîne de caractères aléatoire est facile – utilisez simplement java.util.Random et une chaîne contenant tous les caractères que vous voulez être disponibles, par exemple

 public static Ssortingng generateSsortingng(Random rng, Ssortingng characters, int length) { char[] text = new char[length]; for (int i = 0; i < length; i++) { text[i] = characters.charAt(rng.nextInt(characters.length())); } return new String(text); } 

Maintenant, pour l'unicité, vous devrez stocker les chaînes générées quelque part. Votre façon de faire dépendra du rest de votre application.

C’est très gentil:

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/RandomSsortingngUtils.html

Si vous voulez l’unicité (avec une forte probabilité), envisagez d’utiliser des hachages MD5 ou SHA.

Vous pouvez également utiliser la classe UUID du package java.util, qui renvoie un uuid aléatoire de caractères de 32 bits. Ssortingng.

java.util.UUID.randomUUID().toSsortingng()

http://java.sun.com/j2se/1.5.0/docs/api/java/util/UUID.html

 Random ran = new Random(); int top = 3; char data = ' '; Ssortingng dat = ""; for (int i=0; i<=top; i++) { data = (char)(ran.nextInt(25)+97); dat = data + dat; } System.out.println(dat); 

Je pense que le code de classe suivant vous aidera. Il prend en charge le multithreading, mais vous pouvez apporter certaines améliorations, comme supprimer le bloc de synchronisation et synchroniser avec la méthode getRandomId ().

 public class RandomNumberGenerator { private static final Set generatedNumbers = new HashSet(); public RandomNumberGenerator() { } public static void main(Ssortingng[] args) { final int maxLength = 7; final int maxTry = 10; for (int i = 0; i < 10; i++) { System.out.println(i + ". studentId=" + RandomNumberGenerator.getRandomId(maxLength, maxTry)); } } public static String getRandomId(final int maxLength, final int maxTry) { final Random random = new Random(System.nanoTime()); final int max = (int) Math.pow(10, maxLength); final int maxMin = (int) Math.pow(10, maxLength-1); int i = 0; boolean unique = false; int randomId = -1; while (i < maxTry) { randomId = random.nextInt(max - maxMin - 1) + maxMin; synchronized (generatedNumbers) { if (generatedNumbers.contains(randomId) == false) { unique = true; break; } } i++; } if (unique == false) { throw new RuntimeException("Cannot generate unique id!"); } synchronized (generatedNumbers) { generatedNumbers.add(String.valueOf(randomId)); } return String.valueOf(randomId); } } 

La première question que vous devez vous poser est de savoir si vous avez vraiment besoin d’un identifiant aléatoire. Parfois, les identifiants séquentiels sont suffisants.

Maintenant, si vous en avez besoin pour être aléatoire, nous remarquons tout d’abord qu’une séquence de nombres générée ne contenant pas de doublons ne peut pas être appelée aléatoire. : p Maintenant que nous obtenons ce résultat, le moyen le plus rapide de le faire est de disposer d’un Hashtable ou d’un HashMap contenant tous les ID déjà générés. Chaque fois qu’un nouvel identifiant est généré, vérifiez-le par rapport à la table de hachage, générez une nouvelle génération si l’ID se produit déjà. Cela fonctionnera généralement bien si le nombre d’étudiants est bien inférieur à la gamme des identifiants. Si ce n’est pas le cas, vous rencontrez des problèmes plus profonds car la probabilité de devoir régénérer un identifiant augmente, P (génère un nouvel identifiant) = number_of_id_already_generated / number_of_all_possible_ids. Dans ce cas, revenez au premier paragraphe (avez-vous besoin que l’ID soit aléatoire?).

J’espère que cela t’aides.

Beaucoup de possibilités …

Vous savez générer au hasard un entier à droite? Vous pouvez ainsi en générer un caractère … (ex 65 -> A)

Cela dépend de ce dont vous avez besoin, du niveau d’aléa, de la sécurité impliquée … mais pour un projet d’école, je pense que l’obtention d’une sous-chaîne UUID correspondrait 🙂