我必须生成一个11位数的ID号,但是当我使用随机包时,它说它超出了范围,那么我怎么能把它变成十一个呢?
public static int generateID(){
Random r = new Random();
int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);
return numbers;
}
答案 0 :(得分:3)
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
。
答案 1 :(得分:2)
为确保均匀分布,您应使用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
答案 2 :(得分:1)
这里:
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
会在11
和0
之间生成99 999 999 999
位数字。
例如,试试:
public static long generateID() {
return 10000000000L + ((long)rnd.nextInt(900000000)*100) + rnd.nextInt(100);
}
答案 3 :(得分:1)
Java' int'的最大值是2147483647.十位数,只有9位,除非你将它限制在该值以下。
有几种方法可以解决这个问题,但最简单的方法是使用数据类型' long'而不是' int'。长期'的最大值是19位数,应该支持您的用例。
答案 4 :(得分:0)
使用long
。像这样:
public static int generateID(){
Random r = new Random();
long numbers = 1000000000L + (long)(r.nextDouble() * 999999999L);
return numbers;
}
“L”要明确告诉编译器我们需要long
s,而不是int
s。