我正在尝试生成20个随机布尔值并查看它们是否具有相同的值,即全部为真或全为假。我期望程序运行一段时间,因为概率应该是=lookup(h1, {0, 0.01, 1}, {"", "In progress", "Completed"})
,这类似于0.00019%。
然而,我运行我的程序(如下所示)并且它非常快速地终止,有时甚至需要1个循环。我的程序或逻辑是否有问题?
1/(2^20) *100 * 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");
}
}
}