创建一个随机测验模式,其中每个数组部分只调用一次

时间:2017-05-30 04:37:19

标签: java android arrays random

我对Android Studio有点新意,我想制作小测验应用。在开始屏幕上,有两个按钮。使用第一个按钮,您只需单击您的问题,然后您可以根据需要从特定的问题编号开始(这已经有效)。使用第二个按钮,我会创建一个随机模式,但每个问题只应该被问到一次。因此,不应该有两次获得相同问题的可能性。

为此,我创建了一个数组:

public ArrayList<Integer> questionsDone = new ArrayList<>();

得到问题数组的长度:

public int maxQuestions = QuestionLibrary.nQuestions.length;

然后我有一个更新问题的功能:

private void updateQuestion(){

    //RANDOM MODE
    if (startNumber == -1) {
        if (questionsDone.size() >= maxQuestions) {
            finishQuiz();
        } else {
            nQuestionNumber = (int) (Math.random() * (maxQuestions));

            do {
                if (questionsDone.contains(nQuestionNumber)) {
                    nQuestionNumber = nQuestionNumber - 1;
                    if (nQuestionNumber == -1) {
                        nQuestionNumber = maxQuestions-1;
                    }
                } else {
                    questionsDone.add(nQuestionNumber);
                    notDone = true;
                }

            } while (notDone = false);
        }
    }
    nQuestionView.setText(nQuestionLibrary.getQuestion(nQuestionNumber));
    nButtonChoice1.setText(nQuestionLibrary.getChoice1(nQuestionNumber));
    nButtonChoice2.setText(nQuestionLibrary.getChoice2(nQuestionNumber));
    nButtonChoice3.setText(nQuestionLibrary.getChoice3(nQuestionNumber));

所以我的想法是,当我开始随机模式时,我传递值“-1”。如果数组的大小(问题已完成)等于可用问题的数量,则测验应该停止。如果没有,我只是得到一个随机数并乘以问题数。然后有一个do-while函数,它确保如果questionsDone-Array已经包含数字,它将获得一个新数字,并且在获得一个不在数组中的数字后,它将被存储在数组中。

当我点击随机模式时,这就是应用程序的作用:

它始终显示一个随机问题,但有时会问一次问题两次甚至更多。然后它突然停止(应用程序正在加载结果页面),但停止时没有模式。当我有7个问题时,每个问题最少询问一次,有时在15个之后停止,有时在20个问题之后停止等等。

有人知道为什么吗?

2 个答案:

答案 0 :(得分:0)

由于我想向你们两个人提供更新,我发布了一个anwser。谢谢大家的好意见。它现在有效,这就是我的工作方式:

首先我创建了一个数组:

FILE_TMP="/temp.list"
while IFS= read line
do
ping $line
done < "$FILE_TMP"

然后我将整数放在数组中,从0开始,结束maxQuestions-1,然后我拖拽了这些值:

public ArrayList<Integer> availableQuestions = new ArrayList<>();

然后在每个按钮上单击此函数开始工作(j被声明为一个值为0的整数):

if (startNumber == -1) {
        Integer i = 0;

        do {
            availableQuestions.add(i);
            i++;
        }while (i < maxQuestions);

        Collections.shuffle(availableQuestions);
    }

答案 1 :(得分:-1)

我建议保留QuestionAvailable(即尚未回答)作为库中问题的索引,而不是保留QuestionsDone

  List<Integer> availableQuestions = null;

  ...................................................

  if (startNumber == -1) {
        if (availableQuestions.isEmpty()) {
            finishQuiz(); 
            availableQuestions = null;
        } else {
             if (availableQuestions == null) {
                 // Starting a new quiz
                 availableQuestions = new List<Integer>(maxQuestions);
                 for (int i=0; i<maxQuestons; i++) availableQuestions.Add(i);
              }

            int nQuestionOrder = (int) (Math.random() * availableQuestions.size());

            nQuestionNumber = availableQuestions.get(nQuestionOrder);
            availableQuestions.removeAt(nQuestionOrder);  

        }
    }