2013-02-10 33 views
-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(); 
    } 
} 

它的作用是將隨機數添加到保存它的列表中,並檢查是否已經包含它。我覺得我失去了一些明顯的東西來流利地做這項工作。

+0

請編輯代碼片段,只留下*有意義的*部分。 – abatishchev 2013-02-10 05:06:39

回答

0

最簡單的方法是隨機化列表,然後按順序開始處理。

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

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

這是什麼東西做的是「排序」名單,但因爲我們是給分揀機一個新的隨機 Guid每次所以它會隨機列表。然後,我們可以使用這個混亂的測驗來完成剩下的代碼。

1.這不是一種隨機的「安全」方式,因爲某人可以對輸出進行密碼分析以預測問題的順序,但是您並不試圖加密保護,而只是試圖爭奪測驗問題和這個解決方案已經夠好了。有關更多信息,請參閱this SO question關於洗牌的更多信息。

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())); 
} 
相關問題