从数组字符串中获取随机的8个元素值,没有重复的元素

时间:2015-07-19 17:03:06

标签: c# arrays random

我有一个长度为100的字符串数组。 我希望在C#中没有重复元素的100个元素中随机获得8个元素。 请帮我。 我很感激。 我只是用:

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

上面的代码只执行8个第一个值而不是8个随机值。

4 个答案:

答案 0 :(得分:6)

简单方法:

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

有效方式:使用Fisher–Yates shuffle。 Jon Skeet提供了实施here

答案 1 :(得分:0)

这是代码。 说明 随机生成0到99之间的数字。

使用哈希集来跟踪我正在挑选的索引。如果索引存在于hashset中,则表示该值已被选中,因此请跳过它。

如果数组中的值不唯一,则在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之间。通过这种方式,您将获得唯一的数字。

答案 2 :(得分: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);
}

答案 3 :(得分: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);