Создание 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;
}