如何在二维数组中随机选择一个位置放置一个字符串

问题描述:

我正在学习Java,并在基于网格的guessingGame项目上工作,我对loadtargetGrid()方法有一些困难。如何在二维数组中随机选择一个位置放置一个字符串

我有一个名为网格的字符串的二维数组,我想在六个随机选择的网格位置放置六个符号“X”。我希望对其他位置不做任何处理,并将它们默认保留为空。

public class Grid 
{ 
public static final int ROWS  = 5;  // number of rows 
public static final int COLUMNS = 5;  // number of columns 
public static final int NUMBER_OF_TARGETS = 6; // number of targets in the grid 

private String[][] grid;    // the grid itself, a 2-D array of String 
private Random random;     // random number generator 

//Constructor 
public Grid() 
{ 
    grid = new String[ROWS][COLUMNS]; 
    random = new Random(); 
} 

//method 
public void loadTargetGrid() 
{ 
     int counter = 0; 
     while(counter < NUMBER_OF_TARGETS){ 
      int randRow = random.nextInt(ROWS - 1); 
      int randColumn = random.nextInt(COLUMNS - 1); 
      grid[randRow][randColumn] = "X"; 
      ++ counter; 
     } 
} 

这就是我到目前为止。我试着用计数器的while循环在6个随机位置放置一个“X”。它编译,但我不知道这是否工作,我不知道如何检查我的代码是否正确。

+1

你不想从ROWS和COLUMNS中减去1。 nextInt方法已经将结果限制为0到ROWS-1或0到COLUMNS-1。您收到的任一答案都可以让您避免重复的地点。 – 2012-02-08 23:06:44

+0

没错!我认为nextInt(int n)方法将从0到n值,但是n值是唯一的。感谢您的支持 – Poupen 2012-02-08 23:20:35

你可能没有全部6个目标在网格​​上,因为你可以获得相同的点两次。试试这个:

int counter = 0; 
while(counter < NUMBER_OF_TARGETS){ 
    int randRow = random.nextInt(ROWS - 1); 
    int randColumn = random.nextInt(COLUMNS - 1); 
    if (grid[randRow][randColumn] == null) { 
     grid[randRow][randColumn] = "X"; 
     ++ counter; 
    } 
} 
+0

谢谢,我没有想到这个。 – Poupen 2012-02-08 23:02:36

+0

查看我对Louis Wasserman的评论。 – 2012-02-08 23:05:02

如果您不止一次获得相同的随机选择的坐标,则不会以NUMBER_OF_TARGETS个不同位置结束。你可能会尝试像

int randRow, randColumn; 
do { 
    randRow = random.nextInt(ROWS); 
    randColumn = random.nextInt(COLUMNS); 
} while (grid[randRow][randColumn] != null); 
grid[randRow][randColumn] = "X"; 
+0

谢谢!我还没有学习do..while的事情,但我会研究它。 – Poupen 2012-02-08 23:01:47

+1

ROWS - 1和COLUMNS - 1不正确。 (我意识到你从OP复制这些)。 nextInt(n)的合约是它在半开范围[0..n)返回一个int。 – 2012-02-08 23:04:30