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 089 999 999 999 之间的数字。
将此数字添加到 10 000 000 000 将产生一个数字 11 介于 099 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.