Java如何在二维数组的随机不重复位置填充指定数值
实现方案
核心思路
- 为了避免随机位置重复,我们可以先把8×8数组所有64个坐标全部预先生成,再随机打乱顺序,取前6个位置使用:前5个赋值为1,第6个赋值为2,从根源上避免坐标重复问题,逻辑简单且不会出现反复重试的死循环问题。
- Java中int类型数组初始化后默认值就是0,原来的手动赋值全0的循环可以省略。
完整可运行代码
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class CastleTilesTest { public static void main(String[] args) { int castleTiles[][] = new int[8][8]; // 预生成所有坐标 List<int[]> allPositions = new ArrayList<>(); for (int i = 0; i < castleTiles.length; i++) { for (int j = 0; j < castleTiles[i].length; j++) { allPositions.add(new int[]{i, j}); } } // 随机打乱坐标顺序 Collections.shuffle(allPositions); // 前5个互不重复的位置赋值1 for (int k = 0; k < 5; k++) { int[] pos = allPositions.get(k); castleTiles[pos[0]][pos[1]] = 1; } // 第6个和前面完全不重复的位置赋值2 int[] pos2 = allPositions.get(5); castleTiles[pos2[0]][pos2[1]] = 2; // 打印最终数组 for(int i = 0; i < castleTiles.length; i++) { for(int j = 0; j < castleTiles[i].length; j++) { System.out.printf("%3d", castleTiles[i][j]); } System.out.println(); } } }
轻量实现方案(适合小数据场景)
如果不想预生成全量坐标,也可以每次生成随机坐标后判断是否未被占用(值为0),确认可用后再赋值:
import java.util.Random; public class CastleTilesTest2 { public static void main(String[] args) { int castleTiles[][] = new int[8][8]; Random random = new Random(); // 生成5个不重复的1 int count1 = 0; while (count1 < 5) { int i = random.nextInt(8); int j = random.nextInt(8); if (castleTiles[i][j] == 0) { castleTiles[i][j] = 1; count1++; } } // 生成1个和1不重复的2 while (true) { int i = random.nextInt(8); int j = random.nextInt(8); if (castleTiles[i][j] == 0) { castleTiles[i][j] = 2; break; } } // 打印最终数组 for(int i = 0; i < castleTiles.length; i++) { for(int j = 0; j < castleTiles[i].length; j++) { System.out.printf("%3d", castleTiles[i][j]); } System.out.println(); } } }
内容的提问来源于stack exchange,提问作者nah114
相关产品推荐
相关产品推荐

