检查 20 个随机布尔值是否具有相同的值

Checking if 20 random booleans have the same value

我正在尝试生成 20 个随机布尔值并查看它们是否具有相同的值,即全真或全假。我希望程序 运行 一段时间,因为概率应该是 1/(2^20) *100 * 2,大约是 0.00019%。

但是,我 运行 我的程序(如下所示)它终止得非常快,有时甚至需要 1 个循环。是我的程序有问题,还是我的逻辑有问题?

BigInteger bi = BigInteger.ZERO; 

    Random rand = new Random();

    while (true) {
        bi = bi.add(BigInteger.ONE);
        System.out.println(bi);

        boolean x = rand.nextBoolean();
        if (x == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            == rand.nextBoolean() == rand.nextBoolean()
            ) {

            System.out.print(x);
            return;
        }
    }

感谢所有评论和提示。问题其实很简单。想象一下 x = true 并且第一个随机布尔值是 false。第一个 x == rand.nextBoolean() 将被评估为 false。但是它不会终止循环,而是会通过 false == next_random_bool.

继续评估条件

正确的程序应该是:(令人惊讶的是,它只需要大约 100 万次循环...)

    BigInteger bi = BigInteger.ZERO; 

    Random rand = new Random();

    while (true) {
        bi = bi.add(BigInteger.ONE);

        boolean x = rand.nextBoolean();
        if (x == rand.nextBoolean()
            && x == rand.nextBoolean()
            && x == rand.nextBoolean()
            && x == rand.nextBoolean()
            && x == rand.nextBoolean()
            ...
            ) {

            System.out.println(bi);
            System.out.print(x);
            return;
        }
    }

也许这样的循环很有用,在演示中会发生什么 - 您不需要评估 10 个表达式,但 2 个可能太少了:

public static void main (String args[])
{
    Random rand = new Random();
    for (int i = 0; i < 10; ++i) {
        boolean x = rand.nextBoolean ();
        boolean y = rand.nextBoolean ();
        boolean z = rand.nextBoolean ();

        System.out.println ("values: " + x + " " + y + " " + z);
        if (x == y == z) {
            System.out.println ("        ^ hit");
        }
    }
}