不重覆隨機整數

亂 序 浮 上 法 :

建 立 一 個 存 放 著 min~MAX 範 圍 所 有 數 字 的 陣 列 , 利 用 交 換 浮 上 的 方 法 取 得 不 重 複 亂 數 數 列 。
例 子 : 取 範 圍 1~10 長 度 3 的 亂 數 數 列 ,
  1. 先 建 立 一 個 陣 列 : a(0)=1, a(1)=2,..., a(i)=i+1 ,..., a(9)=10
  2. 由 0~9 隨 機 選 一 個 數 字 , 例 如 3
  3. 將 第 3個 元 素 與 第 0 個 交 換 , 成 為 a(0)=4,..., a(3)=1 ,..., a(9)=10
  4. 由 1~9 隨 機 選 一 個 數 字 , 例 如 9
  5. 將 第 9 個 元 素 與 第 1 個 交 換 , 成 為 a(0)=4,a(1)=10,..., a(3)=1 ,..., a(9)=1
  6. 由 2~9 隨 機 選 一 個 數 字 , 例 如 2
  7. 將 第 2 個 元 素 與 第 2 個 交 換 , 成 為 a(0)=4,a(1)=10,a(2)=3,..., a(9)=1
  8. 元 素 0~2 就 是 我 們 要 的 亂 數 數 列 了 : (4,10,3)

以 上 的 方 法 很 方 便 , 但 如 果 要 寫 成 一 個 method , 總 不 能 返 回 整 個 a 陣 列 , 因 此 實 作 寫 代 碼 時 有 點 差 異 。

// 返 回 m 個 亂 數 , 範 圍 是 0 到 n-1
public static short[] kShuffle(short m, short n) {
    // 存 放 亂 數 的 陣 列
    short[] number = new short[m];
    // 存 放 0 到 n-1 的 數 字
    short[] set = new short[n];
    for (short i = 0; i < n; i++) {
        set[i] = i;
    }
    Random rand = new Random();
    for (short i = 0; i < m; i++) {
        // 只 取 i 到 n-1 的 亂 數
        short x = (short) (rand.nextInt(n - i) + i);
        number[i] = set[x];
        // 算 法 要 swap,實 際 可 省 略
        // short temp = set[x];
        set[x] = set[i];
        // set[i] = temp;
    }
    return number;
}

沒有留言:

發佈留言