我有一个长度为100的字符串数组。 我希望在C#中没有重复元素的100个元素中随机获得8个元素。 请帮我。 我很感激。 我只是用:
for (int i = 0; i < 8; i++)
{
work with 8 values here
}
上面的代码只执行8个第一个值而不是8个随机值。
答案 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);