我必须生成一个11位的ID号,但是当我使用随机包时,它表示它超出范围,那么我如何才能使它成为11位呢?
public static int generateID(){
Random r = new Random();
int numbers = 1000000000 + (int)(r.nextDouble() * 999999999);
return numbers;
}
int不能比int大,用long代替int
Java的可能复制:随机长数在0
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溢出。
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位,他们支持你的用例。
在这里:
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位数字的号码,你可以做的:
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。
例如,尝试:
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。这样的:
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位数字的完整范围。
我只是拿着他的密码让它工作。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/34233.html