0

因此,这是人们可能会做的最简单的事情之一:

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

4 回答 4

7
    Random rng = new Random();
    int a = rng.nextInt(10);
    int b = rng.nextInt(9);
    if (b >= a) ++b;

问题解决了!

于 2009-11-28T17:30:34.967 回答
4

我不知道为什么会发生这种情况——我在 1.6.0_16 for 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!” 连续输出一次或两次,但之后它就起作用了。

于 2009-11-28T17:08:54.640 回答
1

实际上,它应该可以工作。你的环境有问题。

但是,理论上,我们无法预测随机是什么;如果随机生成器连续一百万次为您提供相同的数字,那是合法的。要获得确定性代码,您可以执行以下操作:

int a = rng.nextInt(10);
int b = rng.nextInt( 9);
b = (a+b+1)%10;
于 2009-11-28T18:36:55.753 回答
0

您可以尝试将种子设置为其他内容,看看是否有帮助。

rng.setSeed(123456);

于 2009-11-28T17:20:00.200 回答