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.

66
demandé sur Tshepang 2010-05-19 12:18:21

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.

127
répondu Jon Skeet 2010-05-19 08:23:35

C'est très joli:

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

si vous voulez unicité (avec une forte probabilité) envisager D'utiliser MD5 ou SHA hashes.

52
répondu David Soroko 2013-07-15 17:03:51

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()

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

17
répondu Parth 2018-05-19 01:13:58
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);
5
répondu karthik.j 2012-10-29 00:52:09

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);
}

}
2
répondu Erol Ozcan 2015-05-13 18:54:12

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.

1
répondu Chris Henry 2010-05-19 08:26:38

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 :)

1
répondu Sebastien Lorber 2010-05-19 12:16:31