我正在尝试使用以下代码生成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);
}
答案 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位数值和负数的原因是您要添加fraction
,long
(带符号的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;
}