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

本文关键字:元素 获取 随机 8个 字符串 数组 | 更新日期: 2023-09-27 18:03:31

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

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

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

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

简单方法:

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

有效方法:使用Fisher-Yates洗牌法。Jon Skeet提供了实现

代码如下:解释随机生成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;
}

注意我假设这里没有为哈希集使用额外内存的约束(因为最多只能有8个成员)。如果这是约束条件,那么另一种方法是将索引分成8个部分。第一个下标在0-8之间,下一个下标在9-16之间,然后是1。这样您将得到唯一的数字。

您可以使用泛型,只需:

    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);

这很简单,只需将其传递给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);
}