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

Java 產生 0-9 不重複隨機數:Collections.shuffle 簡潔高效

     編輯:程式設計疑難解答

需求

拼圖遊戲需要 0-9 十個數字隨機排列,每個數字只出現一次。

錯誤寫法

int x = (int)(Math.random() * 9);  // ❌ 只能產生 0-8,且會重複

正確做法:List + Collections.shuffle

List numbers = new ArrayList<>();
for (int i = 0; i <= 9; i++) numbers.add(i);  // 0,1,2...9
Collections.shuffle(numbers);                  // 原地隨機打亂
// numbers 現在是隨機順序,且無重複
// 取前 N 個或全部使用
for (int n : numbers) System.out.print(n + " ");

替代方案:Fisher-Yates 洗牌演算法 (手寫版)

int[] nums = {0,1,2,3,4,5,6,7,8,9};
Random rand = new Random();
for (int i = nums.length - 1; i > 0; i--) {
    int j = rand.nextInt(i + 1);  // 0 <= j <= i
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}
// nums 即為隨機排列

關鍵點

  • Math.random() * 9 範圍是 [0, 9) → 0~8,**漏掉 9**。正確若要 0~9 應 * 10。
  • 直接用 Random.nextInt(10) 重複呼叫**無法保證不重複**,需自行維護 Set 去重,效率低。
  • Collections.shuffle 內部即為 Fisher-Yates,**O(n)、均勻分布、程式碼最簡潔**。

應用於拼圖遊戲

// 建立 3x3 拼圖 (0 代表空格)
List tiles = new ArrayList<>();
for (int i = 0; i < 9; i++) tiles.add(i);  // 0-8
Collections.shuffle(tiles);
// 判斷可解性:逆序數偶數才可解,若不可解交換任意兩個非零格
// 然後填入按鈕陣列
for (int i = 0; i < 9; i++) buttons[i].setText(tiles.get(i).toString());

總結

產生 0-9 不重複隨機序列:**建立 List 0-9 → Collections.shuffle()**。簡潔、標準、無 Bug,避免手寫隨機邏輯錯誤。

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