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 : コードは奇数の上限で終了しているように見えますが、偶数の上限でスタックする可能性があります
UPD2c
:コメントで提案されているように、統計を取得するようにコードを変更しました。
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 分の 1 に減少しますが、最後の行に注意してください。ここでは気が狂い、キャプチャされた統計は完全に奇妙に見えます。
対数スケールの棒グラフは次のとおりです。
c
256 回の値を取得する方法は、17
さらに別の謎です