2015-04-21 108 views
0

我真的喋喋不休如何使用這個短語,但我在C#中創建了一個程序,它基本上是隨機輸出它,但爲了避免重複,我從ArrayList中刪除它。混洗陣列 - 缺少數字c#

現在,它的工作原理,但有時它覆蓋了一個已經說過的當前數字,並留下一個按鈕空白。

我會告訴我下面的代碼:

Button[] buttons = new Button[3]; 
     int questionNumber = 0; 
     int qNumber = 0; 
     int x = 1; 


Random r = new Random(); 
      List<Button> listOfButtons = new List<Button>(); 
      listOfButtons.Add(buttons[0]); 
      listOfButtons.Add(buttons[1]); 
      listOfButtons.Add(buttons[2]); 



      int rIndex; 

      while (qNumber < 3) 
      { 
       rIndex = r.Next(0, listOfButtons.Count); //Choose a random object from list 
       listOfButtons[rIndex].Text = qAnswer[questionNumber, x++]; // adds text to button 
       listOfButtons.Remove(buttons[rIndex]); // removes button from index 
       qNumber++; 


      } 



private void EasyLevel_Load(object sender, EventArgs e) 
     { 
      buttons[0] = a1; // a1 is button 
      buttons[1] = a2; 
      buttons[2] = a3; 
     } 

回答

0

有很多方法可以解決這個,但我建議這個簡單的方法:

1)使用洗牌類洗牌陣列。這其中使用了Fisher-Yates shuffle

public class Shuffler 
{ 
    public Shuffler() 
    { 
     _rng = new Random(); 
    } 

    public void Shuffle<T>(IList<T> array) 
    { 
     for (int n = array.Count; n > 1;) 
     { 
      int k = _rng.Next(n); 
      --n; 
      T temp = array[n]; 
      array[n] = array[k]; 
      array[k] = temp; 
     } 
    } 

    private readonly Random _rng; 
} 

2)你有,你想在一個隨機的順序訪問問題的集合。如果問題出現在數組或列表中,則可以直接對其進行洗牌。 )

var indices = Enumerable.Range(0, qAnswer.Count()).ToArray(); 

3然後你得洗那些索引::如果他們不是(這我假設),那麼反而可以從0到n-1,其中N是問題的數量創建索引列表

var shuffler = new Shuffler(); 
shuffler.Shuffle(indices); 

4)最後,你可以使用這些指數(現在是按照隨機順序)來訪問隨機順序問題:

foreach (var index in indices) 
    buttons[0].Text = qAnswer[questionNumber, index]; 

(我不是從代碼一定要張貼是否應該是qAnwser[questionNumber, index]qAnswer[index, questionNumber]或別的東西,所以你可能需要更改...)

0

如果您需要按隨機順序排序列表,使用實現IComaprer<T>
以下是我已經寫了一些一RandomComparer一個比較器年前已經證明了自己有用的時間時間後:

public class RandomComparer<T> : IComparer<T> 
{ 
    private Random rnd; 
    public RandomComparer() { 
     rnd = new Random(); 
    } 

    public RandomComparer(int Seed) { 
     rnd = new Random(Seed); 
    } 
    public int Compare(T x, T y) 
    { 
     return rnd.Next(-1, 2); 
    } 
} 

要使用它,只是這樣寫:listOfButtons.Sort(new RandomComparer<Button>());

0

我認爲你有問題,因爲listOfButtons.Remove(buttons[rIndex])沒有爲對象的平等檢查你THI它確實如此。

嘗試使用listOfButtons.RemoveAt(rIndex)代替。

0

一種不同的方法,通過按鈕,而不是文本循環:

Button[] buttons = new Button[] 
{ 
    button1, 
    button2, 
    button3 
}; 

List<string> text = new List<string>() {"1", "2", "3"}; 

Random random = new Random(); 

foreach (var button in buttons) 
{ 
    string str = text[random.Next(0, text.Count() - 1)]; 
    button.Text = str; 
    text.Remove(str); 
}