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

我正在尝试使用以下代码生成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  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 >>>>>>>>>>>>>>>>>>>"+fraction); int randomNumber = (int)(fraction + aStart); logger.info("Generated : " + randomNumber); } 

我认为你获得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); } 

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

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

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

我不知道为什么没有人意识到这一点,但我认为重点是生成“独特”的随机数,我也试图这样做。 我设法生成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 

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

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

也许你正在寻找这个:

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

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

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

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

希望它有效。

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