Java 如何在二维数组中填充十个随机元素,而不多次填充其中一个元素?

Java 如何在二维数组中填充十个随机元素,而不多次填充其中一个元素?,java,Java,我试图用字符“B”填充2D数组中的十个随机元素,但其中一些元素被填充了不止一次——这使得它不能像我想要的那样填充十个元素 这就是我现在使用的: for(int i = 0; i < 10; i++) { board[(int)(Math.random()*(board.length-1))][(int)(Math.random()*(board[0].length-1))] = 'B'; } 其中elements是要填充的元素数 对于非锯齿阵列: pub

我试图用字符“B”填充2D数组中的十个随机元素,但其中一些元素被填充了不止一次——这使得它不能像我想要的那样填充十个元素

这就是我现在使用的:

   for(int i = 0; i < 10; i++)

   {

     board[(int)(Math.random()*(board.length-1))][(int)(Math.random()*(board[0].length-1))] = 'B';

   }

其中elements是要填充的元素数

对于非锯齿阵列:

public static void fillElements(char[][] array, int elements) {
    if (array.length * array[0].length < elements) throw new IllegalArgumentException();
    boolean[][] filled = new boolean[array.length][array[0].length];
    int i = 0;
    while (i < elements) {
        int x = (int) (Math.random() * array.length);
        int y = (int) (Math.random() * array[0].length);
        if (!filled[x][y]) {
            filled[x][y] = true;
            array[x][y] = 'B';
            i++;
        }
    }
}
public static void fillElements(char[][] array, int elements) {

        int max = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i].length > max) {
                max = array[i].length;
            }
        }
        if (array.length * max < elements) throw new IllegalArgumentException();

        boolean[][] filled = new boolean[array.length][max];
        int i = 0;
        while (i < elements) {
            int x = (int) (Math.random() * array.length);
            int y = (int) (Math.random() * array[x].length);
            if (!filled[x][y]) {
                filled[x][y] = true;
                array[x][y] = 'B';
                i++;
            }
        }
    }
对于锯齿阵列:

public static void fillElements(char[][] array, int elements) {
    if (array.length * array[0].length < elements) throw new IllegalArgumentException();
    boolean[][] filled = new boolean[array.length][array[0].length];
    int i = 0;
    while (i < elements) {
        int x = (int) (Math.random() * array.length);
        int y = (int) (Math.random() * array[0].length);
        if (!filled[x][y]) {
            filled[x][y] = true;
            array[x][y] = 'B';
            i++;
        }
    }
}
public static void fillElements(char[][] array, int elements) {

        int max = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i].length > max) {
                max = array[i].length;
            }
        }
        if (array.length * max < elements) throw new IllegalArgumentException();

        boolean[][] filled = new boolean[array.length][max];
        int i = 0;
        while (i < elements) {
            int x = (int) (Math.random() * array.length);
            int y = (int) (Math.random() * array[x].length);
            if (!filled[x][y]) {
                filled[x][y] = true;
                array[x][y] = 'B';
                i++;
            }
        }
    }

您可以使用一维列表为indexList编制索引,并从索引中随机选择索引。然后将其转换为行、列索引。 检查此代码:

import java.lang.Math; // headers MUST be above the first class
import java.util.Random;
import java.util.ArrayList; 
import java.util.List; 

// one class needs to have a main() method
public class Fill2DArray
{

// arguments are passed using the text field below this editor
public static void main(String[] args)
{
int ROWS=3,COLS=3;    
Random rand = new Random();
List<Integer> indexList = new ArrayList<>();

for (int i = 0; i < ROWS*COLS ; i++){
  indexList.add(i);      
}  

char[][] board = new char[ROWS][COLS];

for(int i=0; i<ROWS*COLS; i++)
{
  int row, col; 
  int lidx = rand.nextInt(indexList.size());    
  int index = indexList.get( lidx );

  row = index/ROWS;    
  col = index%ROWS;
  board[row][col] = 'B';
  indexList.remove(lidx);    
} 
}
}