2017-09-15 191 views
-1

大家好我正在創建一個叫做Quiz遊戲的程序。現在我的問題是如何產生一個不重複的問題?我所有的問題都存儲在switch語句中。我試過並搜索了所有可能的解決方案,但仍然得到相同的輸出結果。我的下面的代碼只是一個樣本,我沒有粘貼它所有的bcoz它太長。每當我調用Question()方法時,它都會隨機,但有時候已經問過的問題正在被再次提問。如何在c中生成唯一的隨機數字#

public void Question() 
    { 

    var random = new Random((int)DateTime.Now.Ticks); 
     var randomValue = random.Next(1, 8); 
     switch (randomValue) 
     { 
      case 1: 
    ans = 1; 

        btnA.Visible = true; 
        btnB.Visible = true; 
        btnC.Visible = true; 
        btnD.Visible = true; 
        btn50.Enabled = true; 
        btndoubledip.Enabled = true; 

        lblQuestion.Text = "1+1=?"; 
        voice = new SpeechSynthesizer(); 
        voice.SelectVoiceByHints(VoiceGender.Male, VoiceAge.Child); 
        voice.SpeakAsync(lblQuestion.Text.ToString()); 

        btnA.Text = "2"; 
        btnB.Text = "1"; 
        btnC.Text = "4"; 
        btnD.Text = "5"; 


       } 
       break; 
+1

我甚至不認爲你的發佈代碼會編譯。 – maccettura

+6

你真的在錯誤地思考這個問題。首先,不要使用switch語句 - 將問題保存在List中,隨機排列列表(在Stack Overflow上執行該操作的方法很多),然後按照新的順序遍歷它們。 – DavidG

+0

你將需要以某種方式存儲已經問過的問題列表。或者在選擇另一個問題之前存儲問題列表並從中刪除項目。 –

回答

1

使用Randomize a List<T>來洗牌清單。所以:

private static Random rng = new Random(); 
public static void Shuffle<T>(this IList<T> list) 
{ 
    int n = list.Count; 
    while (n > 1) 
    { 
      n--; 
      int k = rng.Next(n + 1); 
      T value = list[k]; 
      list[k] = list[n]; 
      list[n] = value; 
    } 
} 

然後只是洗刷你的問題清單,並顯示它們從頭到尾。

List<Question> questions = new List<Question>() 
{ 
    question1, 
    question2, 
    question3 
    //... 
} 
questions.Shuffle(); 
foreach (Question question in questions) question.Ask(); 
+0

Fisher-Yates shuffle incase有人想讀更多關於算法,它非常酷! –