如何用随机整数填充矩阵而不重复它们?

时间:2019-04-25 20:53:09

标签: java

菜鸟编程。 我正在尝试编写Bingo游戏,但我遇到了两个我不知道该如何处理的艰巨挑战。  -如何用非重复整数填充2d数组。  -如何在宾果卡(矩阵)的中间留出空白。那就是应该的样子。

这是我用来填充矩阵值的函数

public static void fillBoard(int [][] pBoard){

      Random rand = new Random();
       for (int[] pBoard1 : pBoard) {
           for (int j = 0; j < pBoard1.length; j++) {
               pBoard1[j] = rand.nextInt(100);
           }
       }


   }

这是我初始化矩阵的方式

public static int [] [] defineBoard(){

        int [] [] board = {{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5},
            {1,2,3,4,5},};

        return board;

    }

我以这种方式打印

public static void printBoard(int [][] pBoard){

       for(int [] rows : pBoard) 
        {
            for(int column : rows) 
            {
                System.out.print("| " + column + " ");
            }
                System.out.println("|");
        }
}

这是我的输出示例

| 34 | 43 | 6 | 22 | 61 |
| 18 | 95 | 43 | 75 | 53 |
| 40 | 10 | 34 | 38 | 66 |
| 43 | 74 | 77 | 77 | 34 |
| 95 | 69 | 48 | 29 | 38 |

再一次,我的问题是:我不知道如何在中间(3d行,3d列)中留出空白,并且我无法使值不重复。 谢谢!

2 个答案:

答案 0 :(得分:2)

Java平台中有一些类可以使完成此任务更加简单。正如GBloggett所指出的,在Java Collections Framework中定义了HashSet类,以便该集合不能包含重复的值。尝试将现有值添加到HashSet会导致该集合未被修改。利用此合同,您可以通过以下方式生成25个唯一的随机数:

Set<Integer> grid = new HashSet<Integer>();
Random rand = new Random();

while (grid.size() < 25) {
    Integer val = rand.nextInt(100);
    grid.add(val);
}

请注意,Java Collections Frameworks类是通用类型。声明new HashSet<Integer>()只是通知编译器您的Set实例只能包含Integer实例。

打印网格不需要矩阵。您可以直接从HashSet实例获得线性数组,然后利用一些逻辑:即网格行等于(array_index / 5),网格列等于(array_index % 5)。对于您的用例来说也是如此,网格的“中间”总是(row,column)=(2,2),因此您可以利用它来制定一个硬编码的解决方案,以在中间获得一个空白空间:

Integer[] gridInts = grid.toArray(new Integer[0]);
StringBuilder output = new StringBuilder();

for (int index = 0; index < gridInts.length; index++) {
   int row = index / 5;
   int col = index % 5;

   String cell = (row == 2 && col == 2) ? "--" : gridInts[index].toString();
   output.append(" | ").append(cell);
   if (col == 4) output.append(" |" + "\\n");  // causes a new line to start
                                               // after the last column in the grid
}

String result = output.toString();             // gets String from StringBuilder
System.out.println(result);                    // sends grid to standard output

这些代码段应满足您的需求。请注意,三元运算符用于确定是否在输出中生成空白点。这只是一个内联的if-then-else表达式。还要注意,StringBuilder实例用于在构造输出时保留输出。并非绝对必要,可以使用字符串串联运算符代替(它可能更易读)

答案 1 :(得分:0)

重复号码:

我认为您应该创建一个int[]存储所有以前使用过的数字,然后进行一个while()循环,在该循环中您将不断重复直到未使用随机数,例如:伪代码)

int[] usedNumbers = new int[24];
for(int i=0; i<24; i++) {
    boolean isNotRepeated = false;
    int numberToFill = rand.nextInt(100);
    while(!isNotRepeated) {
        for(int n=0; n<usedNumbers.length; n++) {
            if(usedNumbers[n] == numberToFill)
                numberToFill = rand.nextInt(100)
            if(n==23 && usedNumbers[n] != numberToFill)
                isNotRepeated = true;
        }
    usedNumbers[i] = numberToFill;
}

空位:

使用此int[]打印出以下内容:(伪代码)

for(int i=0; i<usedNumbers.length+1; i++) {
    if(i==13 /** the middle */) {
        System.out.println("| " + "  " + " ");
    } else if(i<13) { // before the middle
        System.out.println("| " + usedNumbers[i] + " ");
    } else if(i>13) { // after the middle
        System.out.println("| " + usedNumbers[i-1] + " ");
    }
}

我还没有测试过,但是应该有效。

这是与您其他代码不同的样式,但它应该可以工作并且足够简单。

编辑:

我注意到您的'6'值(以及其他任何一位数字的值)看起来像:| x |,而其他值看起来像| xx |,所以我建议您制作一个{{ 1}} 伪代码(都不以这种方式居中)。