Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从没有重复元素的数组字符串中随机获取8个元素值_C#_Arrays_Random - Fatal编程技术网

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

C# 从没有重复元素的数组字符串中随机获取8个元素值,c#,arrays,random,C#,Arrays,Random,我有一个长度为100的字符串数组。 我想在100个元素中随机获得8个元素,而不需要在C#中重复元素。 请帮帮我。 我很感激。 我只是使用: for (int i = 0; i < 8; i++) { work with 8 values here } for(int i=0;i

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

   for (int i = 0; i < 8; i++)
   {
        work with 8 values here
   }
for(int i=0;i<8;i++)
{
在这里使用8个值
}
上面的代码只是为了得到8个第一个值,而不是8个随机值。

简单方法:

var random = new Random();
var randomValues = arr.OrderBy(x => random.Next()).Take(8)
有效方法:使用。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;
}
公共列表GetRandomElements(字符串[]givenArray)
{
if(givenArray==null | | givenArray.Length==0)
{
抛出新的ArgumentNullException(“givenArray”);
}
var rand=new Random();
var randomArray=新列表();
var indexTracker=newhashset();
while(randomArray.Count<8)
{
var nextIndex=rand.Next(0,givenArray.Length);
if(indexTracker.Contains(nextIndex))
{
继续;
}
Add(givenArray[nextIndex]);
index tracker.Add(nextIndex);
}
返回随机数组;
}

注意我在这里假设对hashset使用额外内存没有限制(因为最多只有8个成员)。如果这是约束条件,那么另一种方法是将索引分成8个部分。所以选择第一个指数在0-8之间,下一个指数在9-16之间,所以选择一个。这样,您将获得唯一的数字。

这非常简单,只需将其传递到
HashSet
并应用以下逻辑即可:

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);
}
var mySet=newhashset(myList);
var myList=新列表();
var random=新的random();
对于(int i=0;i<8;i++)
{
int randValue=random.Next(0,mySet.Count());
字符串randSetValue=mySet.ElementAt(randValue);
myList.Add(randSetValue);
mySet.Remove(randSetValue);
}

您可以使用泛型,只需执行以下操作:

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

到目前为止你试过什么?请编辑您的问题并包含此信息。详细信息。string randomPick(string[]strings){返回字符串[random.Next(strings.Length)];}是否可以将您的问题包含任何其他信息?这将执行非常大的排序以提取非常小的值。@Rawling您是对的。当性能问题时,应考虑Fisher-Yates shuffle算法(增加了对Jon Skeet实现的参考)
int[] arr ... 
int[] newArray = GetRandomRange(arr, 8);

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