【发布时间】:2013-11-24 15:27:47
【问题描述】:
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);
代码测试n > 2^30 和bits > n 的情况。然后设置最高有效位并将条件中的结果变为负数。
我知道bits 最多是2^31-1 => 有 50% 的概率。 bits 可以是
不管怎样,
- 为什么 2^31 不能被 n 整除?
- 为什么只有两个数都>2^30才有效?
我猜是一些二进制除法魔法,一种破坏均匀分布的溢出?
谢谢!
【问题讨论】:
-
2^31 是 2147483648 ,在您可以为
n选择的所有 2147483648 个值中,2147483648 只能除以其中的 32 个。