Java:如何使用具有特定数量元素的20x20 2D数组

时间:2016-08-10 09:00:20

标签: java

我正在尝试使用特定数量的元素创建一个20x20 Char 2D-Array。例如, A x 20 B X 10 C是剩下的。

在20x20网格周围随机放置20个随机放置的20个随机放置在20x20网格周围,并用C填充所有空白空间。

我正在尝试使用Math.random()来实现这一点,但似乎无法实现。

package quest;
import java.util.*;
public class Quest 
{
    public static void main(String[] args) 
    {
    char [][] board = new char [20][20];
    int j = 0;
    for(int x = 0; x < 20; x++)
    {
    for(int y = 0; y < 20; y++)
    {
    for(int a = 0; a < 20; a++)
    {    
    int chances = (int)(Math.random()*20)+1;      
    if (chances == 1)
    {    
    board[x][y] = 'A';
    }
    }    
    for(int b = 0; b < 10; b++)
    {    
    int chances = (int)(Math.random()*20)+1;      
    if (chances == 1)
    {    
    board[x][y] = 'B';
    }
    if(board[x][y] == 0 )
    {
    board[x][y] = 'C';
    }     
    }        
    System.out.print(board[x][y]+"  ");
    }
    System.out.println();
    }

}

}

4 个答案:

答案 0 :(得分:2)

此解决方案生成一系列400(= 20 x 20个)唯一随机数,范围从0到399,覆盖20 x 20网格中的每个插槽。然后随机填充20个As,10个B和其余的Cs。

使用Math.random的问题在于您冒着多次生成相同随机数的风险。更好的方法是在覆盖2D阵列中每个槽的一系列数字上使用Collections.shuffle()

int WIDTH = 20;
int HEIGHT = 20;
char[][] array = new char[WIDTH][HEIGHT]; 

// generate a random sequence of 400 (= 20 x 20) unique numbers
ArrayList<Integer> numbers = new ArrayList<Integer>();

for (int i = 0; i < WIDTH*HEIGHT; i++) {
    numbers.add(i);
}
Collections.shuffle(numbers);

// add 20 randomly placed As
for (int i=0; i < 20; ++i) {
    int r = numbers.get(i) / WIDTH;
    int c = numbers.get(i) % HEIGHT;

    array[r][c] = 'A';
}

// add 10 randomly placed Bs
for (int i=20; i < 30; ++i) {
    int r = numbers.get(i) / WIDTH;
    int c = numbers.get(i) % HEIGHT;

    array[r][c] = 'B';
}

// fill the rest with Cs
for (int i=30; i < WIDTH*HEIGHT; ++i) {
    int r = numbers.get(i) / WIDTH;
    int c = numbers.get(i) % HEIGHT;

    array[r][c] = 'C';
}

答案 1 :(得分:0)

您可以简单地生成一个随机数,如果它小于0.5,则指定A,否则指定B。然后,您将生成另一个随机数以确定该字母的位置。如果已经采用了该位置,则生成另一个位置,依此类推。

当你用完一封信时,你已经分配了20 A个,你只需随机生成该位置并将B分配到该位置。

完成后,您将简单地遍历数组,如果找到任何空格,则指定C

答案 2 :(得分:0)

在这里,我向您展示如何添加As。对于Bs你也是这样做的。对于Cs,您只需通过您的电路板并将Cs插入空单元格。

 char[][] board = new Char[20][20];
 //Place As
 for (int i = 1; i <= 20; i++) { //20 As
     int randX = (int) (Math.random() * 20); //random number between 0-19
     int randY = (int) (Math.random() * 20);
     while (board[randX][randY] != null) { //find a free cell
         randX = (int) (Math.random() * 20);
         randY = (int) (Math.random() * 20);
      }
      board[randX][randY] = 'A'; //insert A
  }

另一种选择是先用Cs填充电路板,然后如果电池中有C则插入As和Bs。为此,您必须将board[randX][randY] != null更改为board[randX][randY] != 'C'

答案 3 :(得分:0)

您可以将20x20 2D阵列视为400个元素的1D阵列。使用一点数学运算,您可以获得应该放置值的坐标。之后,您可以为将放置A和B字符的位置生成随机数。您必须检查以确保不会覆盖已设置的A或B字符。

    final char[][] matrix = new char[20][20];
    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < 20; j++) {
            matrix[i][j] = 'c';
        }
    }
    final Random random = new Random();
    for (int i = 0; i < 20; i++) {
        while(true) {
            int position = random.nextInt(400);
            if (matrix[position / 20][position % 20] == 'c') {
                matrix[position / 20][position % 20] = 'a';
                break;
            }
        }
    }
    for (int i = 0; i < 10; i++) {
        while(true) {
            int position = random.nextInt(400);
            if (matrix[position / 20][position % 20] == 'c') {
                matrix[position / 20][position % 20] = 'b';
                break;
            }
        }
    }