【发布时间】:2015-03-18 21:29:09
【问题描述】:
我试图了解 java.util.Random.nextInt(int n) 的工作原理,尽管进行了所有搜索甚至调试都无法完全理解实现。
while 循环会引起混乱: http://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt(int)
int bits, val;
do {
bits = next(31);
val = bits % n;
} while (bits - val + (n-1) < 0);
我意识到这应该解决模数偏差,但很难了解如何解决。
问题:怎么可能表达
bits - val + (n-1)
鉴于 bits 值为 31 位长,即 bits 始终为正,是否为负?如果 bits 为正,则 val 始终小于 bits 然后 while 条件始终保持 > 0...
【问题讨论】:
-
next(int n)合约说n的低位将是近似随机的。它不对高位进行断言。高位可以是0或1。当它是1时,bits的值为负数。