web-dev-qa-db-fra.com

Nombre aléatoire Java de longueur donnée

Je dois générer un nombre aléatoire avec exactement 6 chiffres en Java. Je sais que je pourrais passer 6 fois en boucle sur un serveur aléatoire, mais existe-t-il un autre moyen de le faire dans Java SE standard?

EDIT - Question de suivi:

Maintenant que je peux générer mes 6 chiffres, j'ai un nouveau problème, l'identifiant complet que j'essaie de créer est de la syntaxe 123456-A1B45. Alors, comment puis-je randomiser les 5 derniers caractères qui peuvent être A à Z ou 0 à 9? Je pense utiliser la valeur char et randomice un nombre compris entre 48 et 90 et simplement supprimer toute valeur qui obtient les nombres représentant 58 à 64. Est-ce la voie à suivre ou existe-t-il une meilleure solution?

EDIT 2:

Ceci est ma solution finale. Merci les gars pour votre aide!

protected String createRandomRegistryId(String handleId)
{
    // syntax we would like to generate is DIA123456-A1B34      
    String val = "DI";      

    // char (1), random A-Z
    int ranChar = 65 + (new Random()).nextInt(90-65);
    char ch = (char)ranChar;        
    val += ch;      

    // numbers (6), random 0-9
    Random r = new Random();
    int numbers = 100000 + (int)(r.nextFloat() * 899900);
    val += String.valueOf(numbers);

    val += "-";
    // char or numbers (5), random 0-9 A-Z
    for(int i = 0; i<6;){
        int ranAny = 48 + (new Random()).nextInt(90-65);

        if(!(57 < ranAny && ranAny<= 65)){
        char c = (char)ranAny;      
        val += c;
        i++;
        }

    }

    return val;
}
34
Marthin

Générez un nombre compris entre 100000 et 999999.

// pseudo code
int n = 100000 + random_float() * 900000;

Je suis presque sûr que vous avez déjà lu la documentation, par exemple. Random et peut comprendre le reste vous-même.

21
Bombe

Pour générer un nombre à 6 chiffres:

Utilisez Random et nextInt comme suit:

Random rnd = new Random();
int n = 100000 + rnd.nextInt(900000);

Notez que n ne sera jamais composé de 7 chiffres (1000000) car nextInt(900000) peut au plus renvoyer 899999.

Alors, comment puis-je randomiser les 5 derniers caractères pouvant être soit Z, soit 0-9?

Voici une solution simple:

// Generate random id, for example 283952-V8M32
char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
Random rnd = new Random();
StringBuilder sb = new StringBuilder((100000 + rnd.nextInt(900000)) + "-");
for (int i = 0; i < 5; i++)
    sb.append(chars[rnd.nextInt(chars.length)]);

return sb.toString();
64
aioobe

Si vous devez spécifier la longueur exacte des caractères, nous devons éviter les valeurs avec 0 devant. 

La représentation finale de chaîne doit avoir cette longueur de caractère exacte.

String GenerateRandomNumber(int charLength) {
        return String.valueOf(charLength < 1 ? 0 : new Random()
                .nextInt((9 * (int) Math.pow(10, charLength - 1)) - 1)
                + (int) Math.pow(10, charLength - 1));
    }
6
Chand Priyankara

essaye ça:

public int getRandomNumber(int min, int max) {
    return (int) Math.floor(Math.random() * (max - min + 1)) + min;
}
5
Tobias

Pour la question suivante, vous pouvez obtenir un nombre compris entre 36 ^ 5 et 36 ^ 6 et le convertir en base 36.

MIS À JOUR:

en utilisant ce code 

http://javaconfessions.com/2008/09/convert-between-base-10-and-base-62-in_28.html

C'est écrit BaseConverterUtil.toBase36(60466176+r.nextInt(2116316160))

mais dans votre cas d'utilisation, il peut être optimisé en utilisant une StringBuilder et en ayant le numéro dans l'ordre inverse, c'est-à-dire 71 doit être converti en Z1 au lieu de 1Z.

ÉDITÉ:

0
Xavier Combelle
int Rand = (new Random()).getNextInt(900000) + 100000;

EDIT: Correction d'une erreur off-by-1 et suppression de la solution non valide.

0
T.K.