在 J2ME 開發中,隨機數生成是常見需求。java.util.Random 類提供了基礎的隨機數功能,但僅支援 int 和 long 型別。本文將詳細介紹 Random 類的建構方式、核心方法,以及如何靈活控制隨機數範圍,並附上完整程式碼範例。
Random 類提供兩種建構子:
new Random(long seed):指定種子值,相同種子產生的序列完全一致,適合測試與重現。new Random():無參數建構子,內部自動呼叫 System.currentTimeMillis() 作為種子,確保每次執行結果不同。執行期間可隨時呼叫 setSeed(long seed) 重新設定種子。
兩個最常用的方法:
nextInt():回傳 32 位元帶正負號的整數,範圍為 -2^31 ~ 2^31-1。nextLong():回傳 64 位元帶正負號的長整數,範圍為 -2^63 ~ 2^63-1。這兩個方法底層皆呼叫 next(int bits),分別傳入 32 與 64 位元。原始碼邏輯如下:
public int nextInt() {
return next(32);
}
public long nextLong() {
return ((long)next(32) << 32) + next(32);
}
實際開發常需產生特定區間的隨機數,以下技巧可解決正負號與範圍問題:
int res = rdm.nextInt() % 160;
取模運算可將結果限制在 ±159,但分布不完全均勻。
由於 int 為帶正負號 32 位元,最高位為符號位。兩種清除符號位的方法:
// 無號右移 1 位,最高位補 0
int res = (rdm.nextInt() >>> 1) % 160;
// 或使用位元 AND 遮罩
int res = (rdm.nextInt() & 0x7FFFFFFF) % 160;
// 方法一:對正數結果取負
int res = -((rdm.nextInt() >>> 1) % 160);
// 方法二:將最高位強制設為 1
int res = (rdm.nextInt() | 0x80000000) % 160;
import java.util.Random;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class RandomRangeDemo extends MIDlet {
public void startApp() {
Random rdm = new Random();
System.out.println("Range from -160 to +160");
for (int i = 0; i < 5; i++) {
System.out.println(rdm.nextInt() % 160);
}
System.out.println("Range from 0 to +160 (>>>1)");
for (int i = 0; i < 5; i++) {
System.out.println((rdm.nextInt() >>> 1) % 160);
}
System.out.println("Range from 0 to +160 (&0x7FFFFFFF)");
for (int i = 0; i < 5; i++) {
System.out.println((rdm.nextInt() & 0x7FFFFFFF) % 160);
}
System.out.println("Range from -160 to 0 (negative)");
for (int i = 0; i < 5; i++) {
System.out.println(-((rdm.nextInt() >>> 1) % 160));
}
System.out.println("Range from -160 to 0 (|0x80000000)");
for (int i = 0; i < 5; i++) {
System.out.println((rdm.nextInt() | 0x80000000) % 160);
}
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}
Range from -160 to +160 123 -63 -19 103 -145 Range from 0 to +160 (>>>1) 158 64 73 30 72 Range from 0 to +160 (&0x7FFFFFFF) 62 122 141 75 83 Range from -160 to 0 (negative) -74 -115 -37 -144 -98 Range from -160 to 0 (|0x80000000) -27 -151 -57 -72 -7
掌握 Random 類的種子機制、核心方法與位元操作技巧,能靈活應對 J2ME 中各種隨機數需求。實際專案建議根據業務場景選擇適當的範圍控制方式,並注意取模運算可能帶來的分布不均問題。