2015-07-19 36 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);