从没有重复元素的数组字符串中获取随机的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个随机值。
简单方法:
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);
}