在java中生成10位唯一随机数

时间:2011-03-16 16:57:16

标签: java

我正在尝试使用以下代码生成10位唯一随机数。根据我的要求,我必须创建大约5000个唯一数字(ID)。这没有按预期工作。它还会生成-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);

  }

9 个答案:

答案 0 :(得分:28)

所以你想要一个10位数的固定长度随机数?这可以更容易:

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

请注意,Integer.MAX_VALUE上的10位数字不适合int,因此long

答案 1 :(得分:8)

我认为您获得8/9位数值和负数的原因是您要添加fractionlong(带符号的64位值)可能大于正int范围(32位值)到aStart

该值溢出,使randomNumber处于负32位范围内,或几乎缠绕到aStart(因为int是带符号的32位值,{{ 1}}只需略小于(2 ^ 32 - fraction)就可以看到8位或9位数值。

您需要对所有值使用aStart

long

答案 2 :(得分:2)

我不知道为什么没有人意识到这一点,但我认为重点是产生“独特”的随机数,我也试图这样做。我设法生成11位数的随机数,但我不确定如何生成唯一数字。我的方法也有点不同。在这个方法中,我使用for循环将数字字符附加到彼此旁边。然后返回长号。

shouldBeCleared

答案 3 :(得分:0)

这是一种生成固定长度随机数的实用方法。

    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;
}

答案 4 :(得分:0)

我会用

long theRandomNum = (long) (Math.random()*Math.pow(10,10));

答案 5 :(得分:0)

返回“ n”位数的一般解决方案是

Math.floor(Math.random() * (9*Math.pow(10,n-1))) + Math.pow(10,(n-1))

对于n = 3,这将返回100到999之间的数字,依此类推。

您甚至可以控制结束范围,即从100到5xx,但在上述公式“ 5”中设置“ 9”或在1-9中的任何其他数字

答案 6 :(得分:-2)

也许你正在寻找这个:

Random rand = new Random();

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

你可以简单地把它放在循环中。

答案 7 :(得分:-2)

这是从1和2(10位数)开始的随机数。

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

希望它有效。

答案 8 :(得分:-2)

您好,您可以使用以下方法生成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;
}