web-dev-qa-db-fra.com

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

J'ai un objet appelé Student, et il a studentName, studentId, studentAddress, etc. Pour le studentId, je dois générer une chaîne aléatoire composée 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.

68
chandra wibowo

Générer une chaîne aléatoire de caractères est facile - utilisez simplement Java.util.Random et une chaîne contenant tous les caractères que vous souhaitez voir disponibles, 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 des raisons de singularité, vous devrez stocker les chaînes générées quelque part. Cela dépendra vraiment du reste de votre application.

129
Jon Skeet

C'est très gentil:

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

Si vous voulez l'unicité (avec une probabilité élevée), envisagez d'utiliser MD5 ou SHA hash.

52
David Soroko

Vous pouvez également utiliser la classe UUID du package Java.util, qui renvoie des informations aléatoires sur les caractères 32 bits de type String.

Java.util.UUID.randomUUID().toString()

http://Java.Sun.com/j2se/1.5.0/docs/api/Java/util/UUID.html

17
Parth
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
karthik.j

Je pense que le code de classe suivant va vous aider. Il prend en charge le multithreading, mais vous pouvez apporter certaines améliorations, telles que la suppression du bloc de synchronisation et la synchronisation avec 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
Erol Ozcan

La première question que vous devez vous poser est de savoir si vous avez vraiment besoin que l'ID soit aléatoire. Parfois, les identifiants séquentiels suffisent.

Maintenant, si vous avez besoin que ce soit aléatoire, nous notons d’abord une séquence générée de nombres qui ne contiennent pas de doublons ne peut pas être appelée aléatoire. : p Maintenant que nous avons réglé le problème, le moyen le plus rapide de procéder consiste à avoir un Hashtable ou HashMap contenant tous les identifiants 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, recréez-le si l'identifiant existe déjà. Cela fonctionnera généralement bien si le nombre d’élèves est bien inférieur à la plage des ID. Si ce n'est pas le cas, vous avez de plus en plus de problèmes lorsque la probabilité de régénérer un identifiant augmente, P (générer 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.

1
Chris Henry

Beaucoup de possibilités ...

Vous savez comment générer de manière aléatoire un entier non? Vous pouvez ainsi générer un caractère à partir de celui-ci ... (ex 65 -> A)

Cela dépend de ce dont vous avez besoin, du niveau d’aléatoire, de la sécurité impliquée ... mais pour un projet d’école, je suppose qu’obtenir la sous-chaîne UUID conviendrait :)

1
Sebastien Lorber