首页 > 解决方案 > 为什么这个程序不停止数组中的重复项?

问题描述

我正在尝试编写一个生成六个随机整数的程序,并将它们返回给用户,而没有任何数字重复。为什么重复仍然通过?

我在谷歌上搜索过并尝试了一些结果,但似乎没有一个有效。我想到了自己的方法来尝试解决此问题,方法是执行以下操作:

使用 for 循环,我一次将一个数字从drawnNums(具有六个随机数的数组)存储在numToCheck. 还有一个变量numOfDuplicates存储它找到的那个数字的数量。使用另一个 for 循环,我遍历所有数字drawnNums并将其与 进行比较numToCheck,然后将 1 添加到numOfDuplicates. 它显然找到了自己,所以我有一个 if 语句,仅numOfDuplicates在 >= 2 时重绘数字。这是在我创建数组的同一个函数中,所以它应该创建一个新数组并再次检查,重绘直到没有重复。

在我看来,这应该会阻止返回重复项,但事实并非如此。

这是来自我为生成数组而创建的类,以及我上面描述的内容。

// Private function to draw one random number
    private int drawNumber() {
        return random.nextInt(maxNum) + 1;
    }

    // Function to randomly draw six numbers using drawNumber() and store in an array
    int[] draw() {
        int[] drawnNums = {0, 0, 0, 0, 0, 0};
        for (int i = 0; i < drawnNums.length; i++) {
            int draw = drawNumber();
            drawnNums[i] = draw;
        }

        // Check if there are any duplicates in the array, if there are, redraw
        int numOfDuplicates = 0;
        for (int x = 0; x < drawnNums.length; x++) {
            int numToCheck = drawnNums[x];
            numOfDuplicates = 0;
             for (int y = 0; y < drawnNums.length; y++) {
                if (numToCheck == drawnNums[y]) {
                    numOfDuplicates++;
                }
                if (numOfDuplicates >= 2) {
                    draw();
                }
            }
            break;
        }

        return drawnNums;
    }
}

我希望如果数组中有重复项,则将重新绘制数字,直到有一个没有重复项的数组。但是当反复运行程序时,仍然有一些数组有重复。

标签: javaarrays

解决方案


您想在添加之前检查可返回数组中的重复项。换句话说,一旦draw变量接收到一个新的随机值,请查看该值是否已包含在drawNums数组中:

private int[] draw() {
    int[] drawnNums = {0, 0, 0, 0, 0, 0};
    boolean alreadyHave;
    for (int i = 0; i < drawnNums.length; i++) {
        int draw = drawNumber();
        alreadyHave = false;
        for (int j = 0; j < drawnNums.length; j++) {
            if (draw == drawnNums[j]) {
                alreadyHave = true;
                i--;
                break;
            }
        }
        if (!alreadyHave) {
            drawnNums[i] = draw;
        }
    }
    return drawnNums;
}

推荐阅读