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