将数字放在2D数组中的随机点上

时间:2016-01-31 20:52:11

标签: java arrays random

我有一个有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个随机点。

我哪里出错了?

3 个答案:

答案 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();
    }