【问题标题】:Fill a 2D array with random numbers but making sure no number is repeated in a row用随机数填充二维数组,但确保没有数字连续重复
【发布时间】:2017-08-02 06:20:25
【问题描述】:

我正在尝试用从 1 到最大的随机数填充 2D 数组,但以这样一种方式,即没有行包含多个值,并且每行的值从最低到最高排序。例如:

1 3 5 6

2 4 6 7

2 2 5 9

前两行可以,但第三行包含重复值。如何确保不会发生这种情况?任何帮助将非常感激 :)。到目前为止我想出的是:

int[][] array = new int[s][c];
    for (int rows = 0; rows < array.length; rows++) {

        for (int cols = 0; cols < array[rows].length; cols++) {

            array[rows][cols] = (rand.nextInt(max)+1);
            System.out.print(array[rows][cols]);
        }
        System.out.println();

再次,我希望每行中的元素从最低到最高排序,我不知道该怎么做!

【问题讨论】:

  • 我希望每行中的数字从最低到最高排序,并且每一行都是唯一的。可能的重复没有解决这个问题!

标签: java arrays multidimensional-array random


【解决方案1】:

您应该将生成的行值存储在arraylist 中,然后检查新值是否在arraylist 中。

    int[][] array = new int[3][4];
    ArrayList<Integer> row = new ArrayList<>(); //represent a row

    for (int rows = 0; rows < array.length; rows++) {

        for (int cols = 0; cols < array[rows].length; cols++) {

            int randomNumber = rand.nextInt(max)+1; //random number

            //checking if the generated value is in the row
            //otherwise keep on generating new value.
            while(!row.contains(randomNumber)){
                randomNumber = rand.nextInt(max)+1;  
            }
            array[rows][cols] = (randomNumber);
            //end of an row we should clear the previous row.
            row.clear();
            }
            Arrays.sort(array[rows]);

       }

【讨论】:

  • 你觉得在col-for 循环之后调用Arrays.sort(array[row]) 怎么样?
【解决方案2】:

在将值添加到数组之前,请检查它是否已经存在:

int prevNum = 0;
while(true) {
    int num = (rand.nextInt(max) + 1);
    if(!(Arrays.asList(array).contains(num)) && num > prevNum && num < max - 4) {       
         array[rows][cols] = num;
         prevNum = num;
         break;
    }
}

while 循环将继续进行,直到 num 不在数组中,它大于前一个数字,并且至少比 max 小 4(因为这就是数组中有多少个值)第二个数组,我们不希望在第一次尝试时达到最大值),当它将 break(终止 while 循环)。

【讨论】:

  • 如果你第一次滚动最大数量就会有问题。
  • @JasonLang 是的。我修好了它。谢谢。
【解决方案3】:

最好的办法是将这个问题分开。生成一组唯一的随机数,然后在生成后对每一行进行排序。

要生成一组唯一的随机数,您可以采用以下两种方法之一:继续生成数字并对照已经生成的数字检查每个数字,或者创建一组随机抽取的值,以及随时从该集合中删除值。哪一个最简单取决于您从中提取多少可能的值。

例如你可以做一个数组:

 int[] choices = {0,1,2,3,4,5,6,7,8,9};

然后从 0 到 9 随机掷骰,得到你的号码。无论您选择哪个,都将 9 换到那个插槽中。所以例如如果你滚动“4”,数组将变为

int[] choices = {0,1,2,3,9,5,6,7,8,-};

然后你掷出 0-8,并在 8 的位置上交换任何被移除的位置。根据需要对尽可能多的数字重复此操作。显然,这仅适用于选择数量相当少的情况。如果选择的数量很大(例如 32 位数字),则只需随机滚动并检查所有先前创建的数字。

生成每个数字后,对行进行排序插入。

【讨论】:

    猜你喜欢
    • 2017-06-22
    • 2012-07-27
    • 2014-05-10
    • 2017-04-17
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多