min
場合によっては、 からまでの範囲の乱数の反復に対してループを実行する必要がありますmax
。実用的な解決策の 1 つは、次のようなことです。
int numIterations = randomInteger(min, max);
for (int i = 0; i < numIterations; i++) {
/* ... fun and exciting things! ... */
}
多くの初心者プログラマーが犯すよくある間違いは、次のようにすることです。
for (int i = 0; i < randomInteger(min, max); i++) {
/* ... fun and exciting things! ... */
}
これにより、反復ごとにループの上限が再計算されます。
これは、ループが からまでの範囲で繰り返される回数の均一な分布を与えないのではないかと思いますが、このようなことをしたときにどのような分布が得られるか正確にはわかりません。ループの反復回数の分布がどうなるか知っている人はいますか?min
max
具体例として、min
= 0 とmax
= 2 と仮定します。その場合、次の可能性があります。
- の場合
i = 0
、ランダム値は 0 です。ループは 0 回実行されます。 - の場合
i = 0
、ランダム値は非ゼロです。それで:- の場合
i = 1
、ランダム値は 0 または 1 です。ループは 1 回実行されます。 - の場合
i = 1
、ランダム値は 2 です。ループは 2 回実行されます。
- の場合
この最初のイベントの確率は 1/3 です。2 番目のイベントの確率は 2/3 で、その中で最初のサブケースの確率は 2/3、2 番目のイベントの確率は 1/3 です。したがって、平均配布数は
0 × 1 / 3 + 1 × 2 / 3 × 2 / 3 + 2 × 2 / 3 × 1 / 3
= 0 + 4 / 9 + 4 / 9
= 8 / 9
分布が実際に均一である場合、1 回のループ反復が得られると予想されますが、現在は平均で 8/9 しか得られないことに注意してください。私の質問は、この結果を一般化して、反復回数のより正確な値を取得できるかどうかです。
ありがとう!