Заполните массив нулем в случайных местах

#java #arrays #multidimensional-array

Вопрос:

Итак, то, что я пытаюсь сделать, — это заполнить 2D-массив нулями в случайных местах определенное количество раз. Предположим, что в массиве из 90 мест должно быть 20 нулей. То, что я сделал до сих пор, — это объявил 2D-массив и заполнил его случайными числами. И моей следующей мыслью было просто выбрать случайные позиции и заменить их нулями. Есть идеи, как я мог бы это сделать?

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

Комментарии:

1. Вы знаете, как выполнить цикл несколько раз, вы знаете, как получить случайные числа в определенных диапазонах, вы знаете, как получить доступ к ячейкам в вашем массиве с помощью чисел… Я не совсем понимаю, о чем ты спрашиваешь.

Ответ №1:

Это довольно простой способ достижения цели, но он должен выполнять свою работу. Поэтому вам нужно получить длину каждой строки. После того, как вы это сделаете, вы можете вызвать функцию, которая выдаст вам случайное число между некоторой начальной точкой и длиной строки. Вот пример кода, который покажет вам, что я имею в виду:

 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 lt; myboard.length; i  ) {  for (int j = 0; j lt; 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);  } }    

Ответ №2:

Псевдокод будет выглядеть так:

 while (num_zeros_filled lt; 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. Лучшим подходом было бы отобразить двумерный массив в 1-d массив, а затем выполнить выборку только из тех ячеек, которые еще не были заполнены 0.