Java试图用唯一的数字填充int数组

时间:2017-09-26 20:56:09

标签: java arrays int unique infinite-loop

我是这个网站上的新人,我的英语很差,请原谅我。

我的功能有问题:

public void generate(int[] array) {
    int i=0;
    boolean isvalid=true;
    while (i < 5) {
        int rng = (int)(Math.random()%100*100);
        for (int j=0; j < 5; j++) {
            if (array[j] == rng) {
                isvalid=false;
                System.out.println("duplicate: "+rng);
            }
        }
        if (isvalid) {
            array[i]=rng;
            System.out.println(rng);
            i++;
        }
    }
}

我需要填充一个5大小的int数组,其中包含0到100之间的唯一随机数。这是有效的,但有时会出现问题,并且启动无限循环,并且出于某种原因,我的编译器(netbeans)无法生成新的随机数数字,只是循环一些。 例如:

duplicate 62
duplicate 62
duplicate 64
duplicate 97
duplicate 97
duplicate 64
duplicate 97
duplicate 62
duplicate 64
duplicate 62
duplicate 64
duplicate 62
duplicate 97
duplicate 97
duplicate 56
duplicate 97
duplicate 62
duplicate 56
duplicate 56
duplicate 56
duplicate 64
duplicate 56
duplicate 62
duplicate 56

有人对我的问题有任何有用的提示吗? 提前谢谢!

4 个答案:

答案 0 :(得分:2)

isvalid = false;一旦true永远不会i,因此您会获得无限循环,因为在这种情况下您不会增加isvalid = true(快速修复应该是{{} 1}}在while)内。

答案 1 :(得分:1)

我建议你另一种产生这些数字的方法。

首先,您创建一个List,其中包含从1100的所有数字。然后,您只需从list中选择随机数并将它们放入数组

List<Integer> list = IntStream.rangeClosed(0, 100)
             .boxed().collect(Collectors.toList());

int[] randomArray = new int[100];
Random random = new Random();

for(int i = 0; i < 100; i++) {
    Integer randomIndex = random.nextInt(list.size());
    randomArray[i] = list.get(randomIndex);
    list.remove(randomIndex);
}

通过这种方式,您可以确保在一次迭代中获得所需的数组,而无需无用的随机调用。

答案 2 :(得分:1)

使用Java 8为您提供的设施:使用0到100之间的随机整数的无限流,然后是不同的,然后限制为5.由于这是作业,我认为你应该付出一些努力,所以我不会发布几行必需的。

答案 3 :(得分:0)

private List getRandomNumberList(){
    List<Integer> alist = new ArrayList<>();
    while (alist.size() < 5){
        // for numbers from 0 to 100 use factor 101
        int number = (int) (Math.random() * 101);
        if (!alist.contains(number)){
            alist.add(number);
        }
    }
    return alist;
}