upperBound
也就是说,它永远不会使用某些特定参数连续生成超过 16 个偶数:
Random random = new Random();
int c = 0;
int max = 17;
int upperBound = 18;
while (c <= max) {
int nextInt = random.nextInt(upperBound);
boolean even = nextInt % 2 == 0;
if (even) {
c++;
} else {
c = 0;
}
}
在此示例中,代码将永远循环,而当upperBound
例如 16 时,它会快速终止。
这种行为的原因是什么?该方法的javadoc中有一些注释,但我没有理解它们。
UPD1:代码似乎以奇数上限终止,但可能会卡在偶数上限
UPD2:我修改了代码以捕获c
评论中建议的统计信息:
Random random = new Random();
int c = 0;
long trials = 1 << 58;
int max = 20;
int[] stat = new int[max + 1];
while (trials > 0) {
while (c <= max && trials > 0) {
int nextInt = random.nextInt(18);
boolean even = nextInt % 2 == 0;
if (even) {
c++;
} else {
stat[c] = stat[c] + 1;
c = 0;
}
trials--;
}
}
System.out.println(Arrays.toString(stat));
现在它试图20
在行中达到偶数 - 以获得更好的统计数据,并且upperBound
仍然是18
.
结果令人惊讶:
[16776448, 8386560, 4195328, 2104576, 1044736,
518144, 264704, 132096, 68864, 29952, 15104,
12032, 1792, 3072, 256, 512, 0, 256, 0, 0]
起初它按预期减少了 2 倍,但请注意最后一行!在这里它变得疯狂,捕获的统计数据似乎完全奇怪。
这是对数刻度的条形图:
如何c
获得17
256倍的价值又是一个谜