-1

私は、質問を追加して自分自身にクイズを出す一種の自己クイズを作成しています。

私はあなたにすべての質問を届けたいと思っています (可能であれば無作為化されています)。私はすでにある程度機能していますが、時々いくつかの質問を見逃したり、繰り返したりします。

public void LoadUp() {
    if(TimeLimit) {
        timer2.Start();
    }

    KeyWords.Clear();
    Hint_Used=false;
    int QuestionCount=correct+incorrect;
    int AnswerCount=Study_Helper.Form1.QuizList.Count;
    Random random=new Random();
    int randomNumber=random.Next(0, Study_Helper.Form1.QuizList.Count);

    if(!Study_Helper.Form1.PreviousQuestions.Contains(randomNumber)) {
        Study_Helper.Form1.PreviousQuestions.Add(randomNumber);
        String raw=Study_Helper.Form1.QuizList[randomNumber].ToString();
        String[] Split=raw.Split(new char[] { '|' });
        Question=Split[0];
        richTextBox1.Text=Question;
        Answer=Split[1];
        Hint=Split[2];
        String[] NewSplit=Split[3].Split(new char[] { ',' });
        int TotalKeywords=0;

        foreach(string s in NewSplit) {
            TotalKeywords++;
        }

        for(int size=0; size<TotalKeywords-1; size++) {
            String KeyWord=NewSplit[size].ToString();
            KeyWords.Add(KeyWord);
        }
    }
    else if(QuestionCount>=AnswerCount) {
        int Total=correct-incorrect;

        if(Total<0) {
            Total=0;
        }

        timer2.Stop();
        Counter=Study_Helper.Form4.Counter;
        Form6 form6=new Form6();
        form6.Show();
        TimeLimit=false;
        MessageBox.Show("Study Questions over! you got "+Total+" in total, that's "+correct+" correct answers!", "Results", MessageBoxButtons.OK, MessageBoxIcon.Information);
        correct=0;
        incorrect=0;
        this.Close();
    }
}

それが行うことは、乱数を保持するリストに乱数を追加し、それが既に含まれているかどうかを確認することです。これを流暢に機能させるには、明らかな何かが欠けていると感じています。

4

2 に答える 2

2

PreviousQuestionsすべてのインデックスを追跡するために使用すると、複雑になると思います。最初にインデックスをシャッフルすることをお勧めします。このメソッドでスタックを初期化したら、呼び出しrandomNumbers.Pop()て新しい乱数を取得するだけです。

Stack<int> ShuffleNumbers(int count)
{
    IEnumerable<int> range = Enumerable.Range(0, count);
    Random rnd = new Random();
    return new Stack<int>(range.OrderBy(x => rnd.Next()));
}
于 2013-02-10T05:04:44.897 に答える
0

最も簡単な方法は、リストをランダム化し、順番に処理を開始することです。

var randomizedList = Study_Helper.Form1.QuizList.OrderBy(a => Guid.NewGuid());

foreach(var question in randomizedList)
{
    //Handle displaying the question.
}

これが行っているのはリストの「ソート」ですが、ソーターに毎回新しいランダム1を与えるため、リストがランダム化されます。 Guid次に、このスクランブルクイズを残りのコードに使用できます。

1.これは、誰かが出力に対して暗号解析を行って質問の順序を予測する可能性があるため、ランダムにする「安全な」方法ではありませんが、暗号的に安全にしようとしているのではなく、クイズの質問とこのソリューションをスクランブルしようとしているだけです。それで十分です。詳細については、カードのデッキのシャッフルに関するSO の質問を参照してください。

于 2013-02-10T04:55:17.043 に答える