防止数组中的重复整数

时间:2014-04-27 03:14:33

标签: java arrays random numbers unique

我正在为类创建一个程序,该程序要求程序在1-40范围内创建6个随机生成的整数并将它们放入数组中。整数必须是唯一的,因此不能存在数字特定数字重复的情况。然后将该数组传递给另一个按升序对数组进行排序的方法。我的问题是我无法获取代码来生成6个唯一数字。我的代码如下:

private static void getComputer(int computerNumbers, int[] cN)
{
    Random randomNumbers = new Random();

    for (int i = 0; i < computerNumbers;)
    {
        int computerStored = randomNumbers.nextInt(39)+1;
            if (computerStored == cN[0] || computerStored == cN[1] || computerStored == cN[2] || 
                computerStored == cN[3] || computerStored == cN[4] || computerStored == cN[5])
                continue;
            else
                computerStored = cN[i];
                i++;
    }
}

上面的代码块输出一个0,0,0,0,0,0的数组。我无法找出原因。任何帮助将非常感激。谢谢。

为了澄清,我知道如何做一个基本的随机发生器。

private static void getComputer(int computerNumbers, int[] cN)
{
    Random randomNumbers = new Random();

    for (int i = 0; i < computerNumbers; i++)
        cN[i] = randomNumbers.nextInt(39)+1;
}

2 个答案:

答案 0 :(得分:0)

你可能意味着

cN[i] = computerStored;

另请注意,此代码存在三个问题:您正在传递数组的大小,这是Java中的错误形式,您永远无法获得零(从技术上讲,这不是一个错误,因为你处理的只是1-40),你的条件非常笨拙。相反,我这样做:

for(int i = 0; i < cN.length;) {
    int candidate = randomNumbers.nextInt(39) + 1;

    // actually, I'd either move this into another method or use a `Set` in the first place
    boolean duplicate = false;
    for(int j = 0; j < i || !duplicate; j++)
        if(candidate == cN[j])
            duplicate = true;

    if(!duplicate)
        cN[i++] = candidate;
}

答案 1 :(得分:0)

我会以不同的方式处理这个问题:

  • 创建一个整数列表1-40
  • 洗牌他们
  • 从前6个元素
  • 创建一个数组

像这样:

List<Integer> list = new ArrayList<>(40);
for (int i = 1; i < 41; i++)
    list.add(i);
Collections.shuffle(list);
int[] cN = new int[6];
for (int i = 0; i < cN.length; i++)
    cN[i] = list.get(i);

这种方法的优点是你不必处理重复问题,它利用JDK进行随机化。