Comment générer une chaîne de caractères aléatoire en Java [dupliquer]
cette question a déjà une réponse ici:
- comment générer une chaîne alphanumérique aléatoire? 42 réponses
j'ai un objet appelé Student
, et il a studentName
, studentId
, studentAddress
, etc. Pour le studentId
, je dois générer une chaîne de caractères aléatoire se composent 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 de duplicata.
7 réponses
générer une chaîne aléatoire de caractères est facile - il suffit d'utiliser java.util.Random
et une chaîne contenant tous les caractères que vous voulez être disponible, par exemple
public static String generateString(Random rng, String 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 aurez besoin de stocker les chaines générées quelque part. Comment faire cela dépendra vraiment du reste de votre application.
C'est très joli:
si vous voulez unicité (avec une forte probabilité) envisager D'utiliser MD5 ou SHA hashes.
vous pouvez également utiliser la classe UUID de java.le paquet util, qui renvoie un UUID aléatoire de 32 caractères bit.
java.util.UUID.randomUUID().toString()
Random ran = new Random();
int top = 3;
char data = ' ';
String 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 supporte la multithreading mais vous pouvez faire quelques améliorations comme supprimer le bloc sync et et synchroniser la méthode getRandomId ().
public class RandomNumberGenerator {
private static final Set<String> generatedNumbers = new HashSet<String>();
public RandomNumberGenerator() {
}
public static void main(String[] 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 poser est de savoir si vous avez vraiment besoin de L'ID pour être aléatoire. Parfois, les identifiants séquentiels sont suffisants.
maintenant, si vous avez besoin qu'il soit aléatoire, nous remarquons d'abord une séquence générée de nombres qui ne contiennent pas de doublons ne peut pas être appelé aléatoire. :p Maintenant que nous obtenons de la sorte, le moyen le plus rapide de le faire est d'avoir un Hashtable
ou HashMap
contenant tous les Id déjà généré. Chaque fois qu'un nouveau code est généré, vérifier contre le hashtable, re-generate si L'ID se produit déjà. Cela fonctionne généralement bien si le nombre d'étudiants est beaucoup moins élevé que l'étendue de L'IDs. Si ce n'est pas le cas, vous êtes en difficulté plus profonde, car la probabilité de devoir régénérer une ID augmente, P(générer une nouvelle ID) = number_of_id_already_generated / number_of_all_possible_ids. Dans ce cas, vérifier le premier paragraphe (avez-vous besoin de l'ID aléatoire?).
Espérons que cette aide.
plusieurs possibilités...
Vous savez comment générer aléatoirement un entier de droite? Vous pouvez ainsi générer un char... (ex 65 -> A) 151910920"
cela dépend de ce dont vous avez besoin, le niveau d'aléatoire, la sécurité impliquée... mais pour un projet scolaire, je suppose que l'obtention UUID substring conviendrait :)