检查 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");
}
}
}
我正在尝试生成 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");
}
}
}