在nextInt(int)
课程中阅读Random
方法的文档时,我并不了解以下段落的含义:
算法有点棘手。它拒绝会导致分布不均匀的值(由于2 ^ 31不能被n整除)。值被拒绝的概率取决于n。最坏的情况是n = 2 ^ 30 + 1,其中拒绝的概率是1/2,并且循环终止前的预期迭代次数是2.
任何人都可以给我一个被拒绝的数字的例子吗?
负责拒绝将产生非均匀分布的数字的算法是:
int bits, val;
do {
bits = next(31);
val = bits % bound;
} while (bits - val + (bound-1) < 0);
更新:
问题将发生在while
内部计算的表达式中,对于某些大的bits
值,表达式的第一个操作数将溢出整数大小的大小,例如,如果我们取位= 2 ^ 31-2和bound = 3,第一个操作数将等于2 ^ 31,它溢出整数值的最大值(2 ^ 31-1),它将等于负值和{{1}的值}将被拒绝,新值将在下一次迭代中进行测试。