You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:45:05