Создание 10 цифр уникального случайного числа в java
Я пытаюсь использовать код ниже для генерации 10 цифр уникального случайного числа. По моему требованию я должен создать около 5000 уникальных номеров (ids). Это не работает должным образом. Он также генерирует числа -ve. Также иногда одна или две цифры отсутствуют в сгенерированном числе, что приводит к 8 или 9 номерам не 10.
public static synchronized List generateRandomPin(){
int START =1000000000;
//int END = Integer.parseInt("9999999999");
//long END = Integer.parseInt("9999999999");
long END = 9999999999L;
Random random = new Random();
for (int idx = 1; idx <= 3000; ++idx){
createRandomInteger(START, END, random);
}
return null;
}
private static void createRandomInteger(int aStart, long aEnd, Random aRandom){
if ( aStart > aEnd ) {
throw new IllegalArgumentException("Start cannot exceed End.");
}
//get the range, casting to long to avoid overflow problems
long range = (long)aEnd - (long)aStart + 1;
logger.info("range>>>>>>>>>>>"+range);
// compute a fraction of the range, 0 <= frac < range
long fraction = (long)(range * aRandom.nextDouble());
logger.info("fraction>>>>>>>>>>>>>>>>>>>>"+fraction);
int randomNumber = (int)(fraction + aStart);
logger.info("Generated : " + randomNumber);
}
Ответы
Ответ 1
Я думаю, что причина, по которой вы получаете 8/9 цифр и отрицательные числа, заключается в том, что вы добавляете fraction
, long
(подписанное 64-битное значение), которое может быть больше положительного int
(32-битное значение) до aStart
.
Значение переполняется так, что randomNumber
находится в отрицательном 32-битном диапазоне или почти завернуто в aStart
(так как int
- это 32-битное значение, подписанное под знаком, fraction
должно быть только должно быть немного меньше (2 ^ 32 - aStart
) для просмотра 8 или 9 цифр).
Вам нужно использовать long
для всех значений.
private static void createRandomInteger(int aStart, long aEnd, Random aRandom){
if ( aStart > aEnd ) {
throw new IllegalArgumentException("Start cannot exceed End.");
}
//get the range, casting to long to avoid overflow problems
long range = aEnd - (long)aStart + 1;
logger.info("range>>>>>>>>>>>"+range);
// compute a fraction of the range, 0 <= frac < range
long fraction = (long)(range * aRandom.nextDouble());
logger.info("fraction>>>>>>>>>>>>>>>>>>>>"+fraction);
long randomNumber = fraction + (long)aStart;
logger.info("Generated : " + randomNumber);
}
Ответ 2
Итак, вы хотите, чтобы случайное число с фиксированной длиной 10 цифр? Это можно сделать проще:
long number = (long) Math.floor(Math.random() * 9_000_000_000L) + 1_000_000_000L;
Обратите внимание, что 10-значные числа над Integer.MAX_VALUE
не помещаются в int
, поэтому long
.
Ответ 3
Я не знаю, почему никто этого не осознал, но я думаю, что нужно создать "уникальное" случайное число, которое я также пытаюсь сделать. Мне удалось создать случайное число из 11 цифр, но я не уверен, как создавать уникальные числа. Также мой подход немного отличается. В этом методе я добавляю числовые символы рядом друг с другом для цикла. Затем возвращаем длинное число.
public long generateID() {
Random rnd = new Random();
char [] digits = new char[11];
digits[0] = (char) (rnd.nextInt(9) + '1');
for(int i=1; i<digits.length; i++) {
digits[i] = (char) (rnd.nextInt(10) + '0');
}
return Long.parseLong(new String(digits));
}
Ответ 4
Это метод полезности для генерации случайного числа с фиксированной длиной.
public final static String createRandomNumber(long len) {
if (len > 18)
throw new IllegalStateException("To many digits");
long tLen = (long) Math.pow(10, len - 1) * 9;
long number = (long) (Math.random() * tLen) + (long) Math.pow(10, len - 1) * 1;
String tVal = number + "";
if (tVal.length() != len) {
throw new IllegalStateException("The random number '" + tVal + "' is not '" + len + "' digits");
}
return tVal;
}
Ответ 5
Я бы использовал
long theRandomNum = (long) (Math.random()*Math.pow(10,10));
Ответ 6
Возможно, вы ищете этот вариант:
Random rand = new Random();
long drand = (long)(rand.nextDouble()*10000000000L);
Вы можете просто положить это внутри цикла.
Ответ 7
это для случайного числа, начинающегося с 1 и 2 (10 цифр).
public int gen() {
Random r = new Random(System.currentTimeMillis());
return 1000000000 + r.nextInt(2000000000);
}
надеюсь, это сработает.
Ответ 8
Привет, вы можете использовать следующий метод для генерации 10-значного случайного числа
private static int getRndNumber() {
Random random=new Random();
int randomNumber=0;
boolean loop=true;
while(loop) {
randomNumber=random.nextInt();
if(Integer.toString(randomNumber).length()==10 && !Integer.toString(randomNumber).startsWith("-")) {
loop=false;
}
}
return randomNumber;
}