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

Java 创建一个随机测试模式,其中每个数组部分只调用一次,java,android,arrays,random,Java,Android,Arrays,Random,我对Android Studio有点陌生,我想制作一个小测验应用程序。在开始屏幕上,有两个按钮。使用第一个按钮,你只需点击你的问题,如果你愿意,你可以从一个特定的问题编号开始(这已经起作用了)。用第二个按钮,我想创建一个随机模式,但每个问题只能问一次。因此,不应该有可能得到相同的问题两次 为此,我创建了一个数组: public ArrayList<Integer> questionsDone = new ArrayList<>(); 然后我有一个更新问题的功能: pri

我对Android Studio有点陌生,我想制作一个小测验应用程序。在开始屏幕上,有两个按钮。使用第一个按钮,你只需点击你的问题,如果你愿意,你可以从一个特定的问题编号开始(这已经起作用了)。用第二个按钮,我想创建一个随机模式,但每个问题只能问一次。因此,不应该有可能得到相同的问题两次

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

public ArrayList<Integer> questionsDone = new ArrayList<>();
然后我有一个更新问题的功能:

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数组已经包含该数字,它将获得一个新的数字,在获得一个不在数组中的数字后,它将存储在数组中

这就是我单击随机模式时应用程序所做的:

它总是显示一个随机问题,但有时一个问题会被问两次甚至更多。突然,它停止了(应用程序正在加载结果页面),但停止没有模式。当我有7个问题时,每个问题至少问一次,有时在15个问题后停止,有时在20个问题后停止,以此类推


有人知道为什么吗?

我建议将问题保留为可用(即尚未回答),作为图书馆中问题的索引

  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);  

        }
    }
List availableQuestions=null;
...................................................
如果(开始编号==-1){
if(availableequestions.isEmpty()){
完成测验();
availableQuestions=null;
}否则{
如果(availableQuestions==null){
//开始新的测验
availableQuestions=新列表(maxQuestions);

对于(int i=0;i,因为我想给你们两人一个更新,所以我发布了一个anwser。感谢你们的良好输入。它现在工作了,我就是这样工作的:

首先,我创建了一个数组:

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

您的方法似乎不错,但在这种情况下,您可能希望让它更简单。只需复制您的“正常”模式,但在开始提问之前,“无序”排列顺序。请参阅
List List List=Arrays.asList(nQuestions);Collections.shuffle(List);
感谢您的快速回答。这样您就看不到我的代码中有任何错误了吗?关于您的代码:括号中的“nQuestions”是包含问题的数组,对吗?编辑:啊,我想我现在明白了。在你的例子中,nQuestions是问题的总数,然后你调用一个随机数。没有进入你的代码,但我认为你在使自己复杂化。如果你已经有了工作代码,就重用它:)你的随机模式应该只是洗牌的问题,你可以洗牌的问题(我知道这是什么QuestionLibrary.nQuestions)或你可以得到一个洗牌数组的问题索引。好的,但现在我没有一个数组的问题索引。我有一个问题库(nQuestionLibrary)我有一个nQuestionNumber,它是下一个被调用的问题的编号。所以我必须创建一个包含索引的新数组?所以我创建了一个包含无序索引的数组:if(startNumber=-1){Integer I=0;do{questionsDone.add(I);i++;}while(i=4){finishquick();}else{nQuestionNumber=questionsDone.get(j);j++;}}如果有效,我会通知你的
public ArrayList<Integer> availableQuestions = new ArrayList<>();
if (startNumber == -1) {
        Integer i = 0;

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

        Collections.shuffle(availableQuestions);
    }
 if (startNumber == -1) {
            nQuestionNumber = availableQuestions.get(j);
            j++;
    }