http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28int%29说:
该算法有点棘手。它拒绝会导致分布不均匀的值(因为 2^31 不能被 n 整除)。一个值被拒绝的概率取决于 n。最坏的情况是 n=2^30+1,拒绝的概率是 1/2,循环终止前的预期迭代次数是 2。
算法:
int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
代码测试了 wheren > 2^30
和bits > n
. 然后设置最高有效位并将条件中的结果变为负数。
我知道bits
最多2^31-1
=> 有 50% 的概率。bits
可以是 < 2^30 或介于 2^30 和 2^31之间
反正,
- 为什么2^31 不能被 n 整除?
- 为什么只有当两个数字都> 2 ^ 30时才有效?
我猜是一些二进制除法魔法,一种破坏均匀分布的溢出?
谢谢!