11 Digit random number in Java
我必须生成一个11位的ID号,但是当我使用随机包时,它表示它超出范围,那么我如何才能使它成为11位呢?
1 2 3 4 5 6 7
| public static int generateID (){
Random r = new Random();
int numbers = 1000000000 + (int)(r. nextDouble() * 999999999);
return numbers ;
} |
- int不能比int大,用long代替int
- Java的可能复制:随机长数在0
1 2 3 4 5 6
| import java.util.concurrent.ThreadLocalRandom;
...
public long generateId() {
ThreadLocalRandom random = ThreadLocalRandom.current();
return random.nextLong(10_000_000_000L, 100_000_000_000L);
} |
使用正确的工具。本案例中,Random是小于ThreadLocalRandom值得多。
- 你想知道为什么他们从来没有在Random中添加额外的方法来保持一致。他们似乎认为Random已经过时了,也就是说,如果不把它真正标记为过时的话,就不必费心跟上时代。他们在想什么???????
- @安德烈亚斯是的,我仍然想知道为什么他们没有重写Random来使用相同的方法。这完全是错误的…
- 除此之外,我如何编写一个代码,使每个ID号都是唯一的
- @ekin唯一的方法是将所有的ID放在一个Set中,并检查该集合中是否包含一个ID。
- 我们有没有可能把它放在for循环或其他什么东西上而不是设置
确保均匀分布nextInt(int bound),你应该使用的方法。
因为它无法产生11位数字的能力超出了int),你需要调用它的负载,例如把9位(000000000 999999999 - 2),和第一位(10~99)。
记得使用长的地方,以防止int溢出。
1 2
| long numbers = r.nextInt(1_000_000_000) // Last 9 digits
+ (r.nextInt(90) + 10) * 1_000_000_000L; // First 2 digits |
- 最后是一个很有意义的答案,可以使用所有人都能使用的工具。使用double显然是错误的!
最大的价值是一个Java 2147483647。十位数字与9,除非你只知道它下面这样的价值。
有一些的方式来处理这将是最简单的,但使用datatype长"而"int"。最大值ALONG是19位,他们支持你的用例。
在这里:
1
| int numbers = 1000000000 + (int)(r.nextDouble() * 999999999); |
一个8位的数r.nextDouble() * 999999999副车架。这是additioning 1000000000包含10位到8位号码,不包含,包含一个11位的产生。
此外,11位的要求a long需要intAS Integer.MAX_VALUE= = 2147483647(10位)。
Get a 11位数字的号码,你可以做的:
1
| long n = 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100); |
((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100)归来89 999 999 9990和A之间的数。这会产生一些additionating 10 000 000 000数与数之间的110和99 999 999 999。
例如,尝试:
1 2 3
| public static long generateID() {
return 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);
} |
- 还是10位数
- 在10000000000以下的数字,即0到9999999999实际上不是11位数字。
- 我指的是(long) (Math.random() * 100_000_000_000L)导致0和99_999_999_999之间的数字(含),但其中10%不是11位长,如42只有2位。
- @比以前更糟的是…数字1000000000L有10%的机会被提取,而对方有大约0.000000000 1%…-"-"
使用long。这样的:
1 2 3 4 5 6 7
| public static int generateID (){
Random r = new Random();
long numbers = 1000000000L + (long)(r. nextDouble() * 999999999L );
return numbers ;
} |
"L"是明确告诉编译器,我们要ints longs,逆境。
- 实际上,如果您不使用这个大数字的L,那么编译器会自己说您是不对的!
- 正确的。我们告诉编译器使用long
- (long)(r.nextDouble() * 999999999L)给出了0和999999998之间的数字。加上1000000000L给出了1000000000和1999999998之间的数字。这只是10位数字,不是问题中要求的11位数字,甚至不是10位数字的完整范围。
- 我只是拿着他的密码让它工作。