在随机位置用零填充数组

Fill array with zero in random places

所以,我想要做的是在特定次数的随机位置用零填充二维数组。假设它必须是 90 个位置的数组中的 20 个零。到目前为止我所做的是声明一个二维数组并用随机数填充它。我的下一个想法是简单地选择随机位置并将它们替换为零。知道我该怎么做吗?

int[][] myboard = new int[9][9];
    for (int i = 0; i < myboard.length; i++) {
        for (int j = 0; j < myboard[i].length; j++) {
            myboard[i][j] = (int) (Math.random() * 10);
        }
    }

伪代码如下所示:

while (num_zeros_filled < 20):
   row = random()%total_rows
   col = random()%total_cols
   if (arr[row][col] == 0): # already filled in with 0
       continue
   else:
       arr[row][col] = 0
       num_zeros_filled += 1

然而,如果只生成那些已经填充了 0 的单元格,这在理论上可能会花费无限的时间。更好的方法是将二维数组映射到一维数组,然后采样仅从那些尚未填充 0 的单元格中输出。

这是实现目标的一种相当简单的方法,但它应该可以完成工作。所以你需要得到每一行的长度。完成后,您可以调用一个函数,该函数会在某个起点和行的长度之间为您提供一个随机数。下面是一些代码示例,向您展示我的意思:

import java.util.concurrent.ThreadLocalRandom;
import java.util.Arrays;


public class Example {
    
    public static void main(String []args) {
        int[][] myboard = new int[9][9];
        
        for (int i = 0; i < myboard.length; i++) {
        for (int j = 0; j < myboard[i].length; j++) {
                // fill the row with random vals
                myboard[i][j] = GetRandomNumber(0, myboard[i].length);
            }
            // sneak as much zeros as your heart content
            int random = GetRandomNumber(0, myboard[i].length);
            myboard[i][random] = 0;
        }
        
        System.out.println(Arrays.deepToString(myboard));
    }
     
    private static int GetRandomNumber(int min, int max) {
        /*
            min is the start point
            max is the curr row len
        */
        return ThreadLocalRandom.current().nextInt(min, max);
    }
}