Java 中的 11 位随机数
11 Digit random number in Java
我要生成一个十一位数的身份证号码,但是当我使用随机包时,它说它超出范围,所以我怎样才能使它成为十一?
public static int generateID(){
Random r = new Random();
int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);
return numbers;
}
这里:
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)
returns 0
和 89 999 999 999
之间的数字。
将此数字添加到 10 000 000 000
将产生一个数字 11
介于 0
和 99 999 999 999
之间的数字。
例如,尝试:
public static long generateID() {
return 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);
}
使用 long
。像这样:
public static int generateID(){
Random r = new Random();
long numbers = 1000000000L + (long)(r.nextDouble() * 999999999L);
return numbers;
}
“L”是明确告诉编译器我们想要 long
,而不是 int
。
Java 'int' 的最大值为 2147483647。十位数,除非您将其限制在该值以下,否则只有 9。
有几种方法可以处理这个问题,但最简单的方法是使用数据类型 'long' 而不是 'int'。 'long' 的最大值为 19 位,应支持您的用例。
为确保均匀分布,应使用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
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
.
我要生成一个十一位数的身份证号码,但是当我使用随机包时,它说它超出范围,所以我怎样才能使它成为十一?
public static int generateID(){
Random r = new Random();
int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);
return numbers;
}
这里:
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)
returns 0
和 89 999 999 999
之间的数字。
将此数字添加到 10 000 000 000
将产生一个数字 11
介于 0
和 99 999 999 999
之间的数字。
例如,尝试:
public static long generateID() {
return 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);
}
使用 long
。像这样:
public static int generateID(){
Random r = new Random();
long numbers = 1000000000L + (long)(r.nextDouble() * 999999999L);
return numbers;
}
“L”是明确告诉编译器我们想要 long
,而不是 int
。
Java 'int' 的最大值为 2147483647。十位数,除非您将其限制在该值以下,否则只有 9。
有几种方法可以处理这个问题,但最简单的方法是使用数据类型 'long' 而不是 'int'。 'long' 的最大值为 19 位,应支持您的用例。
为确保均匀分布,应使用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
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
.