如何在已填充随机数的二维数组随机位置填入指定数量的零
二维数组随机填充指定数量零的实现方案
以下是两种生产环境常用的实现方式,你可以根据场景选择:
方法1:随机坐标校验法
适合填充零的数量远小于数组总元素的场景,实现逻辑最简单:
- 循环目标次数(比如你要填20次),每次随机生成行、列坐标
- 校验该位置当前值是否不为0,若符合条件就赋值为0,否则重新生成坐标
代码示例:
import java.util.Random; int zeroCount = 20; // 需要填充的零的数量 Random random = new Random(); // 比直接用Math.random()灵活度更高 while (zeroCount > 0) { int i = random.nextInt(myboard.length); int j = random.nextInt(myboard[0].length); if (myboard[i][j] != 0) { myboard[i][j] = 0; zeroCount--; } }
注意:如果填充零的数量占总元素比例超过80%,不推荐用这个方法,会出现大量重复随机的无效操作
方法2:全局坐标洗牌法
无无效随机操作,适合所有场景,稳定性更高:
- 先把数组所有位置的坐标拼成一个一维集合
- 把集合随机打乱后,取前N个(N是要填充的零的数量)坐标赋值为0即可
代码示例:
import java.util.ArrayList; import java.util.Collections; import java.util.List; // 先构造所有坐标的集合 List<int[]> positions = new ArrayList<>(); for (int i = 0; i < myboard.length; i++) { for (int j = 0; j < myboard[i].length; j++) { positions.add(new int[]{i, j}); } } // 打乱坐标集合 Collections.shuffle(positions); // 取前20个坐标设为0 int zeroCount = 20; for (int k = 0; k < zeroCount; k++) { int[] pos = positions.get(k); myboard[pos[0]][pos[1]] = 0; }
内容的提问来源于stack exchange,提问作者Rrr Rrr
相关产品推荐
相关产品推荐

