What am I doing wrong here

So the idea is a multiple choice questionnaire… 1 question at a time, 4 answers displayed, only one of which being the correct answer. If the correct answer is chosen, remove this question from the list and move on to another question randomly. If the answer is wrong, move to a different question but keep that question in the list so it can be asked again at some random time. I am having issues getting it to work and just can’t figure out how to make this work, I know I am close.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class QAndA : MonoBehaviour
{
    public int numberQ;

    class Question
    {
        public string QuestionText;
        public List<string> Answers = new List<string>();
        public int CorrectAnswer;
    }

    List<Question> listOfQuestions = new List<Question>();
    List<int> answers = new List<int>();

    void Start()
    {
        //Randomize the initial question.
        numberQ = Random.Range(0, listOfQuestions.Count);

        //Questions and answers are listed here. Index beginning at 0.
        //The CorrectAnswer property should set to the correct
        //Index of the correct answer in this first one you can see
        //Correct answer is index "3". 0, 1, 2, and 3("Four Text").
        listOfQuestions.Add(new Question());
        listOfQuestions[0].QuestionText = "What is 2 + 2?";
        listOfQuestions[0].Answers.Add("One");
        listOfQuestions[0].Answers.Add("Two");
        listOfQuestions[0].Answers.Add("Three");
        listOfQuestions[0].Answers.Add("Four");
        listOfQuestions[0].CorrectAnswer = 3;

        listOfQuestions.Add(new Question());
        listOfQuestions[1].QuestionText = "What is 4 + 4?";
        listOfQuestions[1].Answers.Add("One");
        listOfQuestions[1].Answers.Add("Two");
        listOfQuestions[1].Answers.Add("Eight");
        listOfQuestions[1].Answers.Add("Four");
        listOfQuestions[1].CorrectAnswer = 2;

        answers.AddRange(new int[] { -1, -1 });
    }

    void OnGUI()
    {
        //Create the GUILayout area.
        GUILayout.BeginArea(new Rect((Screen.width - 200) / 2, (Screen.height - 200) / 2, 200, 200));

        //Display a question.
        GUILayout.BeginVertical();
        GUILayout.Label(listOfQuestions[numberQ].QuestionText);
        for (numberQ = listOfQuestions.Count; numberQ >= 0; numberQ--)
        {

            //if the correct answer has not been selected display the answers?
            if (answers[numberQ] != listOfQuestions[numberQ].CorrectAnswer)
            {
                //Display the answers for the question.
                GUILayout.BeginHorizontal();
                for (int j = listOfQuestions[numberQ].Answers.Count; j >= 0; j-- )
                {
                    if (GUILayout.Button(listOfQuestions[numberQ].Answers[j]))
                    {
                        answers[numberQ] = j;
                    }
                }
                GUILayout.EndHorizontal();

                if (answers[numberQ] != -1)
                {
                    GUILayout.Label("Wrong");
                    numberQ = Random.Range(0, listOfQuestions.Count);
                    //Move to different question.
                }
            }
            else
            {
                // Display result if correct answer was received
                GUILayout.Label("Correct");
                //Remove this question from list.
                listOfQuestions.Remove(listOfQuestions[numberQ]);
                //Move to different question.
                numberQ = Random.Range(0, listOfQuestions.Count);

            }
            GUILayout.Space(10);
        }
        GUILayout.EndVertical();
        GUILayout.EndArea();
    }
}

here is just the logic:

List<Question> list;

// fill your list with Question's

Question GetQuestion()
{
    int rand = Random.Range(0, list.Count);
    return list[rand];
}

HRESULT CheckAnswer(string answer, Question question)
{
     list.Remove(question);
     if(answer == question.answer)
     {
         return SUCCESS;
     }
     else
     {
         int rand = Random.Range(0, list.Count + 1);
         if(rand > list.Count) 
             list.Add(question);
         else 
             list.Insert(rand, question);
         return FAILED;
     }
}

SUCCESS and FAILED are just enum but you can use whatever you want to report the result. You would use it to display back to the user.

The first method gets a random question object, I guess you can display it already, the second method is called once the user has been entering an answer, I first remove the question since we have to anyway, if it is success, return, if it is failed put it back in the list. It also considers you may want it at the end, if not, this below is enough:

      int rand = Random.Range(0, list.Count);
      list.Insert(rand, question);
      return FAILED;