【问题标题】:Why does my output give me the wrong amount of each number?为什么我的输出给了我每个数字的错误数量?
【发布时间】:2020-09-23 15:10:15
【问题描述】:

我正在尝试制作一个程序,我可以在其中输入二维数组的大小,二维数组中的最大数字,以及二维数组中某个数字的最大数量,然后用随机数填充它介于 1 和最大数之间。在我的代码中,我指定一个数字应重复的最大次数为 4,但我的输出与此不匹配。有什么建议吗?

这是我的代码:

class Main {
    public static void main(String[] args) {
        System.out.println(fill(6, 9, 4));
    }

    public static String fill(int size, int max, int most) {
        int[][] list = new int[size][size];

        int count = 0;

        for (int i = 0; i < list.length; i++) {
            for (int j = 0; j < list[i].length; j++) {
                int x = (int)((Math.random()* max) + 1);
                int y = 0;

                count = 0;
                for (int k = 0; k < list.length; k++) {
                    for (int l = 0; l < list[k].length; l++) {
                        if(list[k][l] == x) count++;
                    }
                }

                if(count < most) {
                    list[i][j] = x;
                } else {
                    while(true) {
                        y = (int)((Math.random()* max) + 1);
                        if(y != x) break;
                    }
                    list[i][j] = y;
                }

                System.out.print(list[i][j] + " ");
            }
            System.out.println();
        }

        return "";
    }
}

这是我的输出:

9 4 6 1 9 1 
7 1 4 4 3 2 
6 1 4 2 7 9 
5 9 4 7 2 5 
3 5 3 5 7 4 
3 8 8 6 2 6 

问题:有6个“4”和2个“8”

【问题讨论】:

    标签: java arrays loops for-loop


    【解决方案1】:

    你生成一个随机数。

    然后检查这个随机数是否“无效”,因为它被使用了太多次。

    然后,您生成一个新的随机数,检查它是否与您之前的数字不同,然后就使用它滚动。您未能检查此号码是否也“超载”。因此,这里可能发生的情况是,您的算法选择了“9”,计数 9,找到其中的 4 个,再次滚动一个新的随机数 9,所以它滚动另一个数字 4,然后只放入 4,没有再次检查。

    重新调整你的 while 循环。

    或者,更好的是,创建一个实用程序类来将生成随机数的工作(而不是已经返回 N 次的数字)卸载到单独的类中,这样您就可以解开这个混乱的代码。

    【讨论】:

      【解决方案2】:

      你的方法

      while(true) {
          y = (int)((Math.random()* max) + 1);
          if(y != x) break;
      }
      

      不检查y 中的count 是否尚未到达most

      【讨论】:

        【解决方案3】:

        您的问题在这里:

        while(true) {
            y = (int)((Math.random()* max) + 1);
            if(y != x) break;
        }
        list[i][j] = y;
        

        这基本上只是排除了 x 将比大多数重复,但不是 y。

        附带说明,我建议使用哈希映射来跟踪事件,而不是一遍又一遍地遍历整个数组。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          • 1970-01-01
          • 2020-07-09
          • 2018-04-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多