首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 隨機數生成完全指南:Random 類用法與範圍控制技巧

     編輯:J2ME

前言

在 J2ME 開發中,隨機數生成是常見需求。java.util.Random 類提供了基礎的隨機數功能,但僅支援 int 和 long 型別。本文將詳細介紹 Random 類的建構方式、核心方法,以及如何靈活控制隨機數範圍,並附上完整程式碼範例。

Random 類的建構與種子設定

Random 類提供兩種建構子:

  • new Random(long seed):指定種子值,相同種子產生的序列完全一致,適合測試與重現。
  • new Random():無參數建構子,內部自動呼叫 System.currentTimeMillis() 作為種子,確保每次執行結果不同。

執行期間可隨時呼叫 setSeed(long seed) 重新設定種子。

核心方法:nextInt() 與 nextLong()

兩個最常用的方法:

  • 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);
}

自訂隨機數範圍的實用技巧

實際開發常需產生特定區間的隨機數,以下技巧可解決正負號與範圍問題:

1. 產生 -160 ~ 160 之間的整數

int res = rdm.nextInt() % 160;

取模運算可將結果限制在 ±159,但分布不完全均勻。

2. 產生 0 ~ 160 的非負整數

由於 int 為帶正負號 32 位元,最高位為符號位。兩種清除符號位的方法:

// 無號右移 1 位,最高位補 0
int res = (rdm.nextInt() >>> 1) % 160;

// 或使用位元 AND 遮罩
int res = (rdm.nextInt() & 0x7FFFFFFF) % 160;

3. 產生 -160 ~ 0 的非正整數

// 方法一:對正數結果取負
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 中各種隨機數需求。實際專案建議根據業務場景選擇適當的範圍控制方式,並注意取模運算可能帶來的分布不均問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved