我必须生成一个11位数字的ID号,但是当我使用随机包时,它说它超出了范围,所以我如何使它11个?
public static int generateID(){
Random r = new Random();
int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);
return numbers;
}发布于 2017-10-13 20:44:39
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低得多。
发布于 2017-10-13 20:24:09
为了确保均匀分布,您应该使用nextInt(int bound)方法。
因为它不能生成11位数字(超出了int的容量),所以您需要调用它两次,例如获得最后9位数(000000000-999999999)和前2位数(10-99)。
记住要在某个地方使用long来防止int溢出。
long numbers = r.nextInt(1_000_000_000) // Last 9 digits
+ (r.nextInt(90) + 10) * 1_000_000_000L; // First 2 digits发布于 2017-10-13 19:56:33
在此:
int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);r.nextDouble() * 999999999生成一个8位数的数字。
将包含10位数字的1000000000加到包含8位数的数字,将永远不会产生包含11位数字的数字。
此外,11位数需要long而不是int作为Integer.MAX_VALUE == 2147483647 (10位数)。
要获得一个11位数字,您可以:
long n = 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100)在0和89 999 999 999之间返回一个数字。
将这个数字加到10 000 000 000将产生一个在0和99 999 999 999之间带有11数字的数字。
例如,尝试如下:
public static long generateID() {
return 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);
}https://stackoverflow.com/questions/46737108
复制相似问题