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

Android 九宮格圖片隨機打亂:Fisher-Yates 洗牌算法保證不重複

     編輯:程式設計綜合問答

問題

9 個 ImageView 隨機分配 9 張圖片,簡單 Random.nextInt 易導致重複。

解決:洗牌索引數組

List indices = new ArrayList<>();
for (int i = 0; i < 9; i++) indices.add(i);
Collections.shuffle(indices); // Fisher-Yates 洗牌,O(n) 均勻隨機

for (int i = 0; i < 9; i++) {
    ImageView iv = findViewById(imageViewIds[i]);
    iv.setImageResource(imageResIds[indices.get(i)]);
}

手動實現洗牌(無 Collections 依賴)

Integer[] arr = {0,1,2,3,4,5,6,7,8};
Random rnd = new Random();
for (int i = arr.length - 1; i > 0; i--) {
    int j = rnd.nextInt(i + 1);
    int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
// arr 即為打亂後的索引順序

進階:標記圖片類型避免相鄰相同

若圖片有類別(如顏色),需約束相鄰不重複,可用回溯或模擬退火算法生成滿足條件的排列。

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