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;
}
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.
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();
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));
}
essaye ça:
public int getRandomNumber(int min, int max) {
return (int) Math.floor(Math.random() * (max - min + 1)) + min;
}
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É:
int Rand = (new Random()).getNextInt(900000) + 100000;
EDIT: Correction d'une erreur off-by-1 et suppression de la solution non valide.