将随机数组编号替换为零

时间:2018-11-16 14:49:42

标签: java arrays random methods

对于你们来说,这可能是一个简单的任务,但是我真的很难使它起作用。我正在创建一种可以返回0-30的随机整数的方法。但是我要确保,相同的数字不会被使用两次。因此,我创建了一个名为UsedNumbersArray的数组来跟踪所有内容。

我的想法是,首先生成一个随机数,然后使用for循环逐个检查数组,以查看是否存在该数组。如果是这种情况,则必须将值替换为零,以确保不会再次找到它。

但是,很奇怪的是它替换了数组中与我们的随机数完全不同的数字。查看我的代码:

    private static int checkIfNumberUsed(){

    int questionNumber = randomNumberInRange(1,questionsWithAnswers[0].length); // create random number

    boolean hasNotBeenUsed = false;

    while (!hasNotBeenUsed){ // as long it HAS been used, it will continue to run the loop and create a random num till it gets what it wants

        for (int i = 0; i < questionsWithAnswers[0].length ; i++) { // check if it has been used before

            if (questionNumber==usedNumbersArray[i]){

                usedNumbersArray[i]=0; // will replace the number with 0 so that it can't be found and used again
                hasNotBeenUsed=true; // will exit the loop

            }

        }

        questionNumber = randomNumberInRange(1,questionsWithAnswers[0].length); // if no matches are found it will generate a new random number

    }


    return questionNumber;

以下是输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

8 [1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、0、19、20、21、22、23、24、25 ,26,27,28,29,30]

如您所见。随机数是8,但它已经用0代替了原来的8替换了18?

希望您能解决这个问题。预先感谢

2 个答案:

答案 0 :(得分:1)

您不必自己迭代数组。使用List.remove(int index)。例如:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Pool {

    private final Random r = new Random();
    private final List<Integer> pool;

    Pool(int size) {
        pool = new ArrayList<>(size);
        for (int i = 0; i < size; ++i) {
            pool.add(i);
        }
    }

    boolean isNotEmpty() {
        return !pool.isEmpty();
    }

    int nextInt() {
        int i = r.nextInt(pool.size());
        return pool.remove(i);
    }

    public static void main(String[] args) {
        Pool pool = new Pool(30);
        while (pool.isNotEmpty()) {
            System.out.println(pool.nextInt());
        }
    }
}

答案 1 :(得分:1)

我提出了一种不同的解决方案,在该解决方案中,您无需与语言打交道,而是可以充分利用其功能。这个想法是使用List而不是数组,并在它们用完时删除值:

import java.util.ArrayList;
import java.util.Collections;

import static java.lang.Integer.valueOf;
import static java.util.stream.Collectors.toList;
import static java.util.stream.IntStream.range;

public class Randoms {
    private final ArrayList<Integer> randomList;

    public Randoms(int size) {
        randomList = (ArrayList<Integer>)range(0, size).boxed().collect(toList());
        Collections.shuffle(randomList);
    }

    public int nextValue() {
        return randomList.remove(0);
    }

    public static void main(String[] args) {
        int size = 30;
        Randoms r = new Randoms(size);
        for (int i = 0; i < size; i++) {
            System.out.println(r.nextValue());
        }
    }
}

如果/当随机值用尽时,您将需要决定怎么做