生成随机数数组并替换重复项

时间:2015-09-17 22:21:30

标签: java arrays random int

我正在生成一个6个整数的数组,范围为1- 54(类似于乐透号码)。但是,在尝试检测重复项时,我的代码没有执行。我试着通过简单的打印来调试"我们已经发现了一个重复的"如果我的条件逻辑会抓住重复。当然,它没有打印出所需的输出:

18-33-39-41-41-45

我想检测副本,以便生成另一个与发现的副本不相等的随机数。我不想仅仅为了获得另一个数字而递增/递减重复的值,我想实际生成1和54之间的另一个不等于副本的值。

这是我的代码:

public class Main {

    public static void main(String[] args) {

        Random rand = new Random();
        int[] luckyArray = new int[6];

        //build array
        for (int i = 0; i < luckyArray.length; i++) {

            int luckyNumber = rand.nextInt(54) + 1;
            luckyArray[i] = luckyNumber;
        }
        //detect duplicates in the array
        for (int i = 0; i < luckyArray.length; i++) {
            if (i > 0 && luckyArray[i] == luckyArray[i - 1]) {
                System.out.print("WE HAVE FOUND A DUPLICATE!");
                /* while (luckyArray[i - 1] == luckyArray[i]) {
                    luckyArray[i] = rand.nextInt(54) + 1;
                }*/
            }
        }
        //sort the array before printing
        Arrays.sort(luckyArray);
        for (int t = 0; t < luckyArray.length; t++) {

            if (t != 5) {
                System.out.print(luckyArray[t] + "-");
            } else System.out.print(luckyArray[t]);
        }
    }
}

我希望将当前索引[i]与之前的[i-1]进行比较,如果/当它们相等时,为当前索引生成一个新值。

提前致谢!

5 个答案:

答案 0 :(得分:4)

我会(个人)依赖Set这里的属性来确保你根本不保留重复项 - 你甚至不需要检查欺骗行为:

    Random rand = new Random();
    int numNumsToGenerate = 6;
    Set<Integer> luckySet = new HashSet<Integer>();

    //build set
    while (luckySet.size() < numNumsToGenerate) {
        luckySet.add(rand.nextInt(54) + 1);
    }

一旦您建立了自己的设置,就可以通过创建一个包含List内容的新Set对其进行排序:

//sort the array before printing
List<Integer> luckyList = new ArrayList<Integer>(luckySet);
Collections.sort(luckyList);

答案 1 :(得分:2)

移动&#39;排序&#39;在检查重复之前。通过这种方式,您可以确保重复项始终位于彼此旁边,您只需要检查邻居。

这里是检测重复项的代码:

package luckynumber;

import java.util.Arrays;
import java.util.Random;

public class Main {

    public static void main(String[] args) {

        Random rand = new Random();
        int[] luckyArray = new int[6];

        // build array
        for (int i = 0; i < luckyArray.length; i++) {

            int luckyNumber = rand.nextInt(54) + 1;
            luckyArray[i] = luckyNumber;
        }
        // sort the array before detecting duplicates
        Arrays.sort(luckyArray);
        // detect duplicates in the array
        for (int i = 0; i < luckyArray.length; i++) {
            if (i > 0 && luckyArray[i] == luckyArray[i - 1]) {
                System.out.print("WE HAVE FOUND A DUPLICATE!");
                /* while (luckyArray[i - 1] == luckyArray[i]) { luckyArray[i] =
                 * rand.nextInt(54) + 1; } */
            }
        }
        for (int t = 0; t < luckyArray.length; t++) {

            if (t != 5) {
                System.out.print(luckyArray[t] + "-");
            } else
                System.out.print(luckyArray[t]);
        }
    }
}

当您现在找到重复项并更改数组项时,请确保重新排序并重新检查整个数组。 这剩下的步骤留给读者练习。 ; - )

BTW:使用Set会使代码更简单。

答案 2 :(得分:2)

这是一个使用Java 8流的非常简单的解决方案:

int[] luckyArray = new Random().ints(1, 55).distinct().limit(6).sorted().toArray();

这并不会手动检测重复项 - 而是在选择前6项之前使用distinct删除它们,然后对它们进行排序。

答案 3 :(得分:1)

使用Java 8:

List<Integer> luckys = 
    IntStream.rangeClosed(1, 54)
             .boxed()
             .collect(collectingAndThen(toList(), l -> {
                 Collections.shuffle(l);
                 return l;
             }))
             .stream()
             .limit(6)
             .collect(toList())

答案 4 :(得分:0)

如果集合不是一个选项,则需要进行每次迭代遍历数组的检查。您当前的支票仅比较序号1和2,2和3等

或者,在插入之前,将要检查的幸运数字分配给int以与阵列进行核对。