Java Random nextInt(int)方法

时间:2016-07-30 17:53:54

标签: java random

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);

来源Random class documentation

更新:

问题将发生在while内部计算的表达式中,对于某些大的bits值,表达式的第一个操作数将溢出整数大小的大小,例如,如果我们取位= 2 ^ 31-2和bound = 3,第一个操作数将等于2 ^ 31,它溢出整数值的最大值(2 ^ 31-1),它将等于负值和{{1}的值}将被拒绝,新值将在下一次迭代中进行测试。

0 个答案:

没有答案