Генерация 10-значного уникального случайного числа в Java - PullRequest
12 голосов
/ 16 марта 2011

Я пытаюсь с помощью кода ниже, чтобы генерировать 10 цифр уникального случайного числа. Согласно моему требованию, мне нужно создать около 5000 уникальных номеров (идентификаторов). Это не работает, как ожидалось. Он также генерирует -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);

  }

Ответы [ 7 ]

28 голосов
/ 16 марта 2011

То есть вы хотите, чтобы случайное число фиксированной длины состояло из 10 цифр?Это можно сделать проще:

long number = (long) Math.floor(Math.random() * 9_000_000_000L) + 1_000_000_000L;

Обратите внимание, что 10-значные числа над Integer.MAX_VALUE не вписываются в int, следовательно, long.

8 голосов
/ 16 марта 2011

Я думаю, причина того, что вы получаете 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 голосов
/ 15 октября 2017

Я не знаю, почему никто не понял этого, но я думаю, что смысл в том, чтобы сгенерировать «уникальное» случайное число, которое я тоже пытаюсь сделать. Мне удалось сгенерировать случайное число из 11 цифр, но я не уверен, как генерировать уникальные числа. Также мой подход немного отличается. В этом методе я добавляю число символов рядом с циклом for. Затем возвращается длинный номер.

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));
}
0 голосов
/ 20 января 2014

Это служебный метод для генерации случайного числа фиксированной длины.

    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;
}
0 голосов
/ 16 августа 2012

Привет, вы можете использовать следующий метод для генерации 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;
}
0 голосов
/ 12 февраля 2012

для случайного числа, начинающегося с 1 и 2 (10 цифр).

public int gen() {
    Random r = new Random(System.currentTimeMillis());
    return 1000000000 + r.nextInt(2000000000);
}

надеюсь, что это работает.

0 голосов
/ 21 июня 2011

Может быть, вы ищете это:

Random rand = new Random();

long drand = (long)(rand.nextDouble()*10000000000L);

Вы можете просто поместить это в цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...