小编top*_*lik的帖子

为什么2 ^ 31不能被n整除?

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);
Run Code Online (Sandbox Code Playgroud)

代码测试的情况在哪里n > 2^30和bits > n.然后设置最高有效位并将条件中的结果转换为负值.

我知道bits最多2^31-1=>有50%的概率.的bits可以是<2 ^ 30或2和2之间^ 30 ^ 31


无论如何,

  1. 为什么2 ^ 31不能被n整除?
  2. 为什么只有当两个数字> 2 ^ 30时它才有效?

我猜一些二元分裂法术,一个破坏均匀分布的溢出?

谢谢!

java random division

6
推荐指数
1
解决办法
221
查看次数

标签 统计

division ×1

java ×1

random ×1