使用随机数填充2D数组,但要确保连续不重复任何数字

时间:2017-03-12 02:58:25

标签: java arrays multidimensional-array random

我正在尝试使用从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();

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

3 个答案:

答案 0 :(得分: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循环)。

答案 1 :(得分:0)

您应该将生成的行值存储在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]);

       }

答案 2 :(得分:0)

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

要生成一组唯一的随机数,您可以采用以下两种方式之一:保持生成数字并针对已生成的数字检查每个数字,或者创建一组随机抽取的值,以及你去的时候从那个集合中删除值。哪一个最容易取决于你从中得到多少可能的值。

e.g。你可以制作一个数组:

 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位数字),那么只需随机滚动并检查所有先前创建的数字。

生成每个数字时,请在行中执行已排序的插入。