所以这是人们可能做的最简单的事情之一:
Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(10);
到目前为止一切顺利。但是我们希望避免使用相等的a和b,所以我们自然会这样做:
Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(10);
while (a == b){
b = rng.nextInt(10);
}
但是 - 令我非常惊讶的是 - while循环从不退出。从不。
据我所知,理论上,随机数你可能有一个无限序列的一个数字。但是我已经让这段代码运行了10分钟,但它还没有退出循环。
这是怎么回事?我正在最新的Linux Mint上运行JDK 6 Update 16.
答案 0 :(得分:7)
Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(9);
if (b >= a) ++b;
问题解决了!
答案 1 :(得分:4)
我不知道为什么会发生这种情况 - 我在1.6.0_16中尝试过Windows并且没有问题。这是完整的课程:
import java.util.Random;
public class Test {
public static void main(String[] args) {
Random rng = new Random();
int a = rng.nextInt(10);
int b = rng.nextInt(10);
while (a == b){
System.out.println(b + " is equal to " + a + "!");
b = rng.nextInt(10);
}
System.out.println(a);
System.out.println(b);
}
}
有时我会得到“a等于b!”连续输出一次或两次,但之后就可以了。
答案 2 :(得分:1)
实际上,它应该有效。你的环境有问题。
然而,理论上,我们无法预测随机是什么;如果一个随机发生器连续给你一百万次相同的数字,这是合法的。要获得确定性代码,您可以执行以下操作:
int a = rng.nextInt(10);
int b = rng.nextInt( 9);
b = (a+b+1)%10;
答案 3 :(得分:0)
您可以尝试将种子设置为其他内容以查看是否有帮助。
rng.setSeed(123456);