我有一个有5行5列的2D数组。我想要它,以便在2D数组中的8个随机点(使其选择一个随机的行和列)来放置一个' 1'。
我做的是调用Random类并生成0到4之间的数字(对于数组的5个点)然后我有两个for循环运行8次(对于我想要的8个随机点),一个经过这一行,另一个经过专栏。
这是我到目前为止的代码:
char[][] battleship = new char[5][5];
//I didn't include this but I have a for loop that populates all the rows and columns with a char of '0'
Random random = new Random();
int randomNum = random.nextInt(4);
for (int i = 0; i < 8; i++)
{
for (int o = 0; o < 8; o++)
{
battleship[randomNum][randomNum] = '1';
}
}
我得到的问题是,不是把它放在&#39; 1&#39;在8个随机点,它背靠背地放了5个点。
我该如何纠正?
以下是输出示例:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
&#39; 1&#39;不是8个随机点。
我哪里出错了?
答案 0 :(得分:4)
嵌套循环每次运行8次将迭代64次。您不需要嵌套循环来执行此操作。其中一个简单的方法是使用while循环并分配8个随机点,直到拍摄所有8个点:
int occupiedSpots = 0;
while(occupieedSpots < 8){
int x = random.nextInt(rows);
int y = random.nextInt(cols);
if(battleship[x][y] == 0){
battleShip[x][y] = 1;
occupiedSpots ++;
}
}
还要确保在每次迭代中生成新的随机数,否则您将始终使用相同的随机值。
使用while循环还可确保所有8个点位于不同位置。如果您只是在没有检查的情况下使用for循环实现它,那么有一些趋势可能会在同一位置出现两次。
答案 1 :(得分:3)
你在循环之前得到一个随机数,所以它永远不会改变。基本上,randomNum
变量已滚动并分配一次 - 您应多次调用nextInt
方法。试试这个:
for (int i = 0; i < 8; i++) {
int randomX = random.nextInt(battleship.length);
int randomY = random.nextInt(battleship[randomX].length);
battleship[randomX][randomY] = '1';
}
请注意,这并不能解决碰撞问题 - 您可能不幸的是多次获得相同的位置并且只填充1-7个点。
来自nextInt(int)
的文档:
返回一个伪随机数,在0之间均匀分布的int值 (包括)和指定值(不包括),由此得出 随机数生成器的序列。
答案 2 :(得分:0)
我会采取不同的方法。如果你假装你的5x5 2D阵列实际上是一个长25个元素的一维数组,那么基本上你需要做的就是在0到25之间产生8个不同的数字。
您的代码也不保证8个随机数都不同。
试试这个:
// Initialize random number array
int[] positions = new int[25];
for (int i = 0; i < 25; i++) {
positions[i] = i;
}
char[][] battleship = new char[5][5];
// Fill the battleship field
for (int i = 0; i < 8; i++) {
int random = (int)(Math.random() * (25 - i - 1));
int position = positions[random];
positions[random] = positions[25 - i - 1];
int row = position / 5;
int col = position % 5;
battleship[row][col] = '1';
}
// Show the field
for (int row = 0; row < 5; row++) {
for (int col = 0; col < 5; col++) {
System.out.print(battleship[row][col] + " ");
}
System.out.println();
}