Заменить случайный номер массива на ноль - PullRequest
0 голосов
/ 16 ноября 2018

Вероятно, простая задача для вас, ребята, однако я действительно изо всех сил стараюсь, чтобы это сработало. Я создаю метод, который может возвращать случайные целые числа от 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, но оно заменило 18 на 0 вместо 8, как предполагалось?

Надеюсь, вы сможете понять это. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Я предлагаю другое решение, в котором вы не боретесь с языком, а повышаете его функциональность. Идея состоит в том, чтобы использовать 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());
        }
    }
}

Вам нужно будет решить, что делать, если / когда у вас заканчиваются случайные значения

0 голосов
/ 16 ноября 2018

вам не нужно итерировать массив самостоятельно. используйте 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());
        }
    }
}
...