如何生成一个没有重复的随机数数组(在Java中)?

时间:2018-11-26 03:28:42

标签: java

以下是我尝试用随机生成的数字填充数组而不产生任何重复项的尝试。但是,我仍然在重复。我要去哪里错了?

Random rnd = new Random();
int x = 6;
int[] selectionsIndex = new int[x];
String[] pool = {"Tom", "Ralph", "Sam", "Craig", "Fred", "Bob", "Tess", "Kayla", "Nina"}; // = 9

for(int i = 0; i < selectionsIndex.length; i++){
    // Initial random
    selectionsIndex[i] = rnd.nextInt(pool.length);

    // Check whether generated number matches any previously generated numbers
    for(int j = 0; j < i; j++){
        // Match, so generate a new number and restart check
        if(selectionsIndex[i] == selectionsIndex[j]){
            selectionsIndex[i] = rnd.nextInt(pool.length);
            j = 0;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您可以在Java中使用Set来添加您生成的随机数,这将使您获得这些数字,并且没有数字会重复。

在代码中可能看起来像这样:

Random rand = new Random();
Set<Integer> uniques = new HashSet<>();
while (uniques.size()<10){
    uniques.add(rand.nextInt(11));
}
for (Integer i : uniques){
    System.out.print(i+" ");
}

有关集合的更多信息:

  • Set是扩展Collection的接口。它是对象的无序集合,无法存储重复的值。

  • 基本上,Set是由HashSet,LinkedHashSet或TreeSet(排序表示)实现的。

  • Set具有多种方法来添加,删除透明,大小等以增强此界面的使用性

Know and read more about Sets here

答案 1 :(得分:0)

如果您不熟悉集合,这里也是一种替代解决方案。

我刚刚做了一个方法来检查数组中是否已经存在该数字。如果是,它将获得一个新的数字,直到它唯一为止。

        Random rnd = new Random();
        int x = 6;
        int[] selectionsIndex = new int[x];
        String[] pool = { "Tom", "Ralph", "Sam", "Craig", "Fred", "Bob", "Tess", "Kayla", "Nina" }; // = 9
        int counter = 0;
        while(counter!=6) {
            int n = rnd.nextInt(pool.length);
            if(!isDuplicate(n,selectionsIndex)) {
                selectionsIndex[counter] = n;
                counter++;
            }
        }

//      testing outputs
//      for(int i = 0; i < selectionsIndex.length ; i++) {
//          System.out.println(selectionsIndex[i]);
//      }

        }
    public static Boolean isDuplicate(int n, int[] a) {
        if(a.length == 0 || a == null) {
            return false;
        }
        for(int i = 0; i < a.length ; i++) {
            if(a[i] == n) {
                return true;
            }
        }
        return false;
    }

答案 2 :(得分:0)

问题出在代码的这一部分

if(selectionsIndex[i] == selectionsIndex[j]){
            selectionsIndex[i] = rnd.nextInt(pool.length);
            j = 0;
        }

乍一看,您的代码看起来绝对不错,但细节在于魔鬼,这是简短的答案,只需执行此操作

j =-1而不是j=0

它将正常工作

魔鬼

您看到,for循环首先递增,然后除初始化步骤外继续执行,因此,当您执行j=0时,您希望检查从0开始,而相反是从1是因为j递增,因此根本不检查0th索引。

这就是为什么您看到仅使用0th索引和某些其他索引而不是其他任何索引对重复的原因。