2013-04-04 33 views
2

我想要做的就是在每次加載我的控制檯應用程序時洗掉下面的數組。例如,蝙蝠俠可以在name[1],name[2]name[3]旁邊,而不是每次都輸入'name [0]'。以這種特定的方式對數組進行混洗?

  heroes[] names = new heroes[4]; 

      names[0] = batman;    
      names[1] = ironman;    
      names[2] = hulk; 
      names[3] = flash; 

怎麼辦?

+0

你可能使用[費雪耶茨隨機播放/隨機播放克努特(http://en.wikipedia.org/wiki/Fisher%E2%80% 93Yates_shuffle)。 [這](http://www.dotnetperls.com/fisher-yates-shuffle)是一個C#的實現,但應該有一個地方的夫婦,如果你做一個搜索.... – nkvu 2013-04-04 18:02:39

+0

傑瑞巴特勒,我已經刪除所有「謝謝你的提示」/「我正在學習」這篇文章......但我沒有看到關於你洗牌的任何「具體」內容。如果你喜歡,隨時可以恢復我的修改,但一定要解釋你需要什麼「特定」的方式來洗牌元素。否則它是非常流行的問題的重複(上面)。 – 2013-04-04 18:09:51

回答

-2
 heroes[] names = new heroes[4]; 
     names[0] = batman; 
     names[1] = ironman; 
     names[2] = hulk; 
     names[3] = flash; 

     var rnd = new Random(DateTime.Now.Second); 
     for (int i = 0; i < heroes.Length; i++) 
     { 
      names[i] = heroes[rnd.Next(0, heroes.Length - 1)]; 
     } 

這應該指向正確的方向。

+3

這不起作用。 – 2013-04-04 18:02:45

+1

這將有很高的機會包括相同的名稱兩次,並留下一個。 – 2013-04-04 18:03:16

+0

@KonradRudolph請做個擴展,簡單的掃描就像沒有任何好處。 – Clint 2013-04-04 18:03:22

3

使用列表,該擴展方法:

public static class ListExtensions 
{ 
    /// <summary> 
    /// Shuffle algorithm as seen on page 32 in the book "Algorithms" (4th edition) by Robert Sedgewick 
    /// </summary> 
    public static void Shuffle<T>(this IList<T> source) 
    { 
     var n = source.Count; 
     for (var i = 0; i < n; i++) 
     { 
      // Exchange a[i] with random element in a[i..n-1] 
      var r = i + RandomProvider.Instance.Next(0, n - i); 
      var temp = source[i]; 
      source[i] = source[r]; 
      source[r] = temp; 
     } 
    } 
} 

public static class RandomProvider 
{ 
    [ThreadStatic] 
    public static readonly Random Instance; 

    static RandomProvider() 
    { 
     Instance = new Random(); 
    } 
} 
相關問題