我正在尝试编写一个程序,它由一个数组组成,其中包含50个随机数,介于1-999之间。但是,在将随机数添加到数组之前,我必须检查该数字是否重复并且不在数组中。
我似乎非常接近正确的输出,但是由于某些原因,我反复地将数字0作为数组中的第一个元素,而且它也是唯一重复的数字。有人知道这是为什么吗?如果知道,可以提供一个合适的解决方案吗?
一旦发现重复项,就需要将其打印到输出中,并替换为新的唯一随机数。
提前谢谢。

import java.util.*;
public class Random50 {
public static void main (String[] args)
{
    final int MAX_SIZE = 50;
    int[] r50 = new int[MAX_SIZE];
    boolean duplicates = false;

    Random rand = new Random();

    for (int i=0; i<r50.length; i++)
    {
        for (int j=i+1;j<r50.length;j++)
        {
            r50[i] = rand.nextInt(1000);

            if (j!=i && r50[i] == r50[j])
            {
                duplicates = true;
                System.out.println("DUPE: " + r50[i]);
                r50[i] = rand.nextInt(1000);
            }

        }
    }

    System.out.println(Arrays.toString(r50));
}

}

最佳答案

j总是大于i,因为将j初始化为i+1。这意味着j引用的r50值始终为0,因此这些值将始终是重复的。
例如,如果i=20,在第二个循环中,j将从21开始。R50[21]、R50[22]等……都是0,因为您还没有设置它们,所以r50[i]和r50[j]的唯一可能副本是0。
编辑:如果j的点是遍历数组的所有前一个元素,那么您将需要

   for (int i=0; i<r50.length; i++)
    {
        r50[i] = rand.nextInt(1000); //Set it before the j loop
        for (int j = 0; j < i; j++)
        {
            while (r50[i] == r50[j]) //while loop, in case of multiple duplicates
            {
                duplicates = true;  //Still not sure why you want this boolean
                System.out.println("DUPE: " + r50[i]);
                r50[i] = rand.nextInt(1000);
            }
    }
}

尽管这仍然不能很好地工作,因为在您检查R50之后,您可能会将其设置为较早的值。例如,如果确保r50[20]不等于j到10的任何值,然后它等于r50[11](当j=11时),则可能会意外地将其更改回小于该值的j(例如r50[5])。
我认为最简单的方法是,就像邓肯和拉吉夫一样,
HashSet numbers = new HashSet();
Random rand = new Random();

while(numbers.size() < MAX_SIZE) {
    numbers.add(rand.nextInt(1000));
}

10-06 08:46