2015-07-19 18 views
2

我有一個字符串數組的長度爲100. 我想獲得100元素中隨機8個元素沒有重複元素在C#中。 請幫幫我。 我很感激。 我只是用:得到隨機8個元素值從數組字符串沒有重複的元素

for (int i = 0; i < 8; i++) 
    { 
     work with 8 values here 
    } 

上面的代碼只是執行中得到8個第一值不爲隨機值。

+0

到目前爲止您嘗試了什麼?請編輯您的問題幷包含此信息。更多信息[這裏](http://stackoverflow.com/help/how-to-ask)。 –

+0

串randomPick(串[]字符串) { 返回字符串[random.Next(strings.Length)]; } – user3009966

+1

您可以請[編輯]您的問題以包含任何其他信息? – NightShadeQueen

回答

6

簡單的方法:

var random = new Random(); 
var randomValues = arr.OrderBy(x => random.Next()).Take(8) 

有效的方法:用Fisher–Yates shuffle。 Jon Skeet提供了執行here

+0

這會執行非常大的操作以提取非常少量的值。 – Rawling

+1

@Rawling你說得對。當性能問題時應考慮Fisher-Yates shuffle算法(對Jon Skeet的實現增加參考) – gisek

0

這是代碼。 說明 隨機產生0到99之間的數字。

使用哈希集跟蹤我選取的索引。如果索引存在於哈希集中,則表示該值已被選中,因此請跳過它。

如果數組中的值不唯一,那麼在hashset中而不是跟蹤索引軌道值。

public List<string> GetRandomElements(string[] givenArray) 
{ 
    if(givenArray == null || givenArray.Length == 0) 
    { 
     throw new ArgumentNullException("givenArray"); 
    } 

    var rand = new Random(); 

    var randomArray = new List<string>(); 

    var indexTracker = new HashSet<int>(); 
    while(randomArray.Count < 8) 
    { 
     var nextIndex = rand.Next(0, givenArray.Length); 

     if(indexTracker.Contains(nextIndex)) 
     { 
      continue; 
     } 

     randomArray.Add(givenArray[nextIndex]); 
     indexTracker.Add(nextIndex); 
    } 

    return randomArray; 
} 

注意我認爲在這裏有上的額外內存的HashSet(因爲只會有8名成員的最大值)沒有限制。如果這是約束,那麼另一種方法可能是將索引分成8個部分。所以選擇0-8之間的第一個索引,9-16之間的下一個索引等等。這樣你會得到唯一的數字。

0

它非常簡單,只需將它傳遞給HashSet<string>,並應用以下邏輯:

var mySet = new HashSet<string>(myList); 
var myList = new List<string>(); 
var random = new Random(); 
for (int i = 0; i < 8; i++) 
{ 
    int randValue = random.Next(0, mySet.Count()); 
    string randSetValue = mySet.ElementAt(randValue); 
    myList.Add(randSetValue); 
    mySet.Remove(randSetValue); 
} 
0

您可以使用泛型和簡單地做:

static T[] GetRandomRange<T>(T[] arr, int length) 
    { 
     var r = new Random(); 

     List<T> elementsList = new List<T>(); 

     for (; elementsList.Count < length;) 
     { 
      T el = arr[r.Next(0, arr.Length)]; 
      if (!elementsList.Contains(el)) elementsList.Add(el); 
     } 
     return elementsList.ToArray(); 
    } 

這樣使用它:

int[] arr ... 
int[] newArray = GetRandomRange(arr, 8); 

MyClass[] arr2... 
MyClass[] newArray2 = GetRandomRange(arr2, 5);