從Java docs for nextInt()
:
所有2 可能INT值的生成(大致)相同的概率。
一種方法是使用下面的變換:
s = rng.nextInt() & Integer.MAX_VALUE; // zero out the sign bit
這樣的事情需要(而不是使用絕對值或否定)的原因是,Integer.MIN_VALUE
的絕對值太大,無法在變成了一個正整數。也就是說,由於溢出,Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE
和Integer.MIN_VALUE == -Integer.MIN_VALUE
。上面的轉換保留了大致均勻的分佈屬性:如果您編寫了一個產生和測試循環,它只丟掉了Integer.MIN_VALUE
並返回了其他所有值的絕對值,那麼正整數將爲零的兩倍。通過將Integer.MIN_VALUE
映射到零,這使得零的概率與正整數一致。
下面是另一種方法,這實際上可以是一點點更快(雖然我沒有基準它):
int s = rng.next(Integer.SIZE - 1); // Integer.SIZE == 32
這將產生具有31隨機低階位(和0作爲整數保證非負值)。但是(如在由JJB的評論中指出),因爲next(int)
是Random
一個protected
方法,你就必須繼承Random
揭露方法(或提供方法的合適的代理):
public class MyRandom extends Random {
public MyRandom() {}
public MyRandom(int seed) { super(seed); }
public int nextNonNegative() {
return next(Integer.SIZE - 1);
}
}
另一種方法是使用包裝4字節數組的ByteBuffer
。然後,您可以生成一個隨機的四個字節(通過調用nextBytes(byte[])
),將符號位置零,然後將該值作爲int
讀取。我不認爲這提供了比上述任何優勢,但我認爲我只是把它扔在那裏。它基本上與我的第一個解決方案相同(用Integer.MAX_VALUE
掩蓋)。
在這種應答的早期版本,我建議使用:
int s = rng.nextInt(Integer.MAX_VALUE);
然而,根據the docs這將產生範圍爲0(含)的整數Integer.MAX_VALUE
(獨家)。換句話說,它不會生成值Integer.MAX_VALUE
。另外,事實證明next(int)
總是會比nextInt(int)
更快。
只相信你在javadocs中閱讀的內容。和(當然)**閱讀javadocs **。 – 2011-04-29 04:07:36
注意'Math.abs'不會在2中工作一次。 (提示:不要使用靜態可變對象) – 2011-04-29 09:53:55