【问题标题】:Putting a number at random spots in 2D array在二维数组中的随机点放置一个数字
【发布时间】:2023-03-21 14:08:01
【问题描述】:

我有一个 2D 数组,它有 5 行和 5 列。我想要它,以便在该二维数组中的 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';

        }
        }

我遇到的问题是,它不是将“1”放在 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

“1”不在 8 个随机位置。

我哪里做错了?

【问题讨论】:

  • 我不会评论您的实际问题,因为您在下面发布了一些有效的解决方案,但您应该使您的 for 循环计数和数组大小匹配。现在您的 battleship 数组有 25 个元素,但您正在尝试循环 64 个元素。
  • 我不相信发布的代码可以创建包含这些内容的数组。
  • 根据您发布的代码,您应该有一个“1”。你如何打印数组?你有更多的动作吗?

标签: java arrays random


【解决方案1】:

每个嵌套循环运行 8 次将对其进行 64 次迭代。你不需要嵌套循环来做到这一点。一种简单的方法是使用 while 循环并分配 8 个随机点,直到所有 8 个点都被占用:

int occupiedSpots = 0;
Random random = new Random();

while(occupiedSpots < 8){
    int x = random.nextInt(array.length);
    int y = random.nextInt(array[0].length);
    if(battleship[x][y] == 0){
        battleship[x][y] = 1;
        occupiedSpots++;
    }
}

还要确保您在每次迭代中生成新的随机数,否则您将始终使用相同的随机值。

使用 while 循环还可以确保所有 8 个点都位于不同的位置。如果你只是简单地用一个 for 循环来实现它而不检查,有一些点可能会两次落在同一个位置上。

【讨论】:

    【解决方案2】:

    你在循环之前得到一个随机数,所以它永远不会改变。基本上,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)的文档:

    返回一个伪随机、均匀分布的 int 值,介于 0 之间 (含)和指定的值(不含),取自此 随机数生成器的序列。

    【讨论】:

    • 是的,但这并不能解释连续的 1。
    • 我认为打印方法有误。
    • 其实这段代码有一些问题。 random.nextInt(4) 将生成 0-3 的随机值。但是 OP 有 5 行和 5 列。另一个问题是在同一位置获得多个 1 的可能性。
    • @user3437460 没错,我专注于生成多个随机值的唯一问题,并复制了一些原始代码。
    【解决方案3】:

    我会采取不同的方法。如果你假设你的 5x5 二维数组实际上是一个长的 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();
        }
    

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 2019-08-04
      • 1970-01-01
      • 2017-10-07
      • 2019-06-29
      • 1970-01-01
      • 2015-10-24
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多