java.util.Random特性

时间:2009-11-28 17:01:35

标签: java random mint

所以这是人们可能做的最简单的事情之一:

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.

4 个答案:

答案 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);