Java随机填充二维数组时如何让指定数量随机位置固定为0
实现方案
核心思路
先正常给数组全量填充1~90的随机整数(避免原生生成0导致最终0的数量超出预期),再生成指定数量的不重复随机坐标,将对应位置的值改为0即可。
实现代码
方法1:HashSet去重法(适合0的数量远小于数组总元素数的场景)
import java.util.HashSet; import java.util.Random; import java.util.Set; // 修改后的随机数生成方法,生成1-90的整数,避免自带0 public static int randomNumber() { int min = 1; int max = 90; return min + (int) (Math.random() * ((max - min) + 1)); } public static void populateArray(int[][] array, int rows, int columns, int zeroCount) { // 第一步:全量填充随机数 for (int indexRow = 0; indexRow < rows; indexRow++) { for (int indexColumn = 0; indexColumn < columns; indexColumn++) { array[indexRow][indexColumn] = randomNumber(); } } // 入参合法性校验 int totalElements = rows * columns; if (zeroCount < 0 || zeroCount > totalElements) { throw new IllegalArgumentException("0的数量必须在0到" + totalElements + "之间"); } Set<String> zeroPositions = new HashSet<>(); Random random = new Random(); // 生成不重复的坐标,直到凑够指定数量 while (zeroPositions.size() < zeroCount) { int randomRow = random.nextInt(rows); int randomCol = random.nextInt(columns); zeroPositions.add(randomRow + "," + randomCol); } // 批量将指定位置设为0 for (String pos : zeroPositions) { String[] parts = pos.split(","); int row = Integer.parseInt(parts[0]); int col = Integer.parseInt(parts[1]); array[row][col] = 0; } } // 调用示例 public static void main(String[] args) { int rows = 3; int columns = 5; int[][] array = new int[rows][columns]; // 填充数组,设置恰好5个0 populateArray(array, rows, columns, 5); }
方法2:坐标洗牌法(适合0的数量较多的场景,无循环重试开销)
import java.util.ArrayList; import java.util.Collections; import java.util.List; public static void populateArray(int[][] array, int rows, int columns, int zeroCount) { // 第一步:全量填充随机数 for (int indexRow = 0; indexRow < rows; indexRow++) { for (int indexColumn = 0; indexColumn < columns; indexColumn++) { array[indexRow][indexColumn] = randomNumber(); } } // 入参合法性校验 int totalElements = rows * columns; if (zeroCount < 0 || zeroCount > totalElements) { throw new IllegalArgumentException("0的数量必须在0到" + totalElements + "之间"); } // 生成所有坐标的集合 List<int[]> allPositions = new ArrayList<>(); for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { allPositions.add(new int[]{i, j}); } } // 打乱坐标顺序 Collections.shuffle(allPositions); // 取前N个坐标设为0 for (int i = 0; i < zeroCount; i++) { int[] pos = allPositions.get(i); array[pos[0]][pos[1]] = 0; } }
内容的提问来源于stack exchange,提问作者Alessandro Ghio
相关产品推荐
相关产品推荐

