小编典典

在填充数组时检查重复项

java

我有一个数组,其中填充了6个随机生成的数字。首先,它生成一个介于1和49之间的随机数,然后将其与数组中的数字进行比较。如果发现重复,则应再次生成一个随机数,然后再次执行检查。如果没有重复项,则将数字添加到数组中。

这是代码:

public void populateArray()
{
    for(int i = 0; i < numberLine.length; i++)
    {
        randomNumber = 1 + randomGen.nextInt(49);
        for(int j = 0; j < i; j++)
        {
            if (numberLine[j] == randomNumber)
            {
                i--;
            }
            else
            {
                continue;
            }
        }
        if(i >= 0)
        {
            numberLine[i] = randomNumber;
        }
        else
        {
            continue;
        }
    }
    Arrays.sort(numberLine);
}

但是,由于某种原因,它仍然允许重复,尽管很少(大约50个数组中的1个),例如6 6 16 24 34 46。但是,当我尝试通过取出随机数元素并使用30这样的数字来重复此操作时,我无法重现结果。怎么了


阅读 203

收藏
2020-11-26

共1个答案

小编典典

实际上,由于您的域限制为1到49之间的整数,因此最好使用布尔数组来指示数字是否已绘制:

public void populateArray()
{
    count = 0;
    boolean[] used = new boolean[50];
    while (count < 6) {
        randomNumber = 1 + randomGen.nextInt(49);
        if (!used[randomNumber]) ++count;
        used[randomNumber] = true;
    }


    int j = 0;
    for (int i = 1; i < used.length; ++i) {
        numberLine[j++] = i;
    }
}

编辑

那仍然有潜在的无限循环。

您正在绘制49个中的6个数字,没有重复项。正确的解决方案是:

 public void populateArray() {
    List<Integer> pool = new ArrayList<Integer>();
    for (int i = 0; i < 49; ++i) {
        pool.add(i + 1);
    }

    for (int i = 0; i < 6; ++i) {
        randomNumber = randomGen.nextInt(pool.size());
        numberLine[i] = pool.get(randomNumber);
        pool.remove(randomNumber);
    }

    Arrays.sort(numberLine);
}

有限循环,概率分布与原始循环相同。无需在遇到重复项时重试抽奖,只需消除预先绘制重复项的可能性。它基本上是在模仿真实的乐透状抽奖。

2020-11-26