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

时间:2018-03-10 09:21:11

标签: java random boolean probability

我正在尝试生成20个随机布尔值并查看它们是否具有相同的值,即全部为真或全为假。我期望程序运行一段时间,因为概率应该是=lookup(h1, {0, 0.01, 1}, {"", "In progress", "Completed"}) ,这类似于0.00019%。

然而,我运行我的程序(如下所示)并且它非常快速地终止,有时甚至需要1个循环。我的程序或逻辑是否有问题?

1/(2^20) *100 * 2

2 个答案:

答案 0 :(得分:1)

感谢所有评论和提示。问题实际上很简单。想象一下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;
        }
    }

答案 1 :(得分:0)

也许这样的循环很有用,在演示中会发生什么 - 你不需要评估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");
        }
    }
}