#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.