我有一个字符串数组的长度为100. 我想获得100元素中随机8个元素没有重复元素在C#中。 请帮帮我。 我很感激。 我只是用:得到随机8个元素值从数组字符串没有重复的元素
for (int i = 0; i < 8; i++)
{
work with 8 values here
}
上面的代码只是执行中得到8个第一值不为随机值。
我有一个字符串数组的长度为100. 我想获得100元素中随机8个元素没有重复元素在C#中。 请帮帮我。 我很感激。 我只是用:得到随机8个元素值从数组字符串没有重复的元素
for (int i = 0; i < 8; i++)
{
work with 8 values here
}
上面的代码只是执行中得到8个第一值不为随机值。
简单的方法:
var random = new Random();
var randomValues = arr.OrderBy(x => random.Next()).Take(8)
有效的方法:用Fisher–Yates shuffle。 Jon Skeet提供了执行here。
这是代码。 说明 随机产生0到99之间的数字。
使用哈希集跟踪我选取的索引。如果索引存在于哈希集中,则表示该值已被选中,因此请跳过它。
如果数组中的值不唯一,那么在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之间的下一个索引等等。这样你会得到唯一的数字。
它非常简单,只需将它传递给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);
}
您可以使用泛型和简单地做:
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);
到目前为止您尝试了什么?请编辑您的问题并包含此信息。更多信息[这里](http://stackoverflow.com/help/how-to-ask)。 –
串randomPick(串[]字符串) { 返回字符串[random.Next(strings.Length)]; } – user3009966
您可以请[编辑]您的问题以包含任何其他信息? – NightShadeQueen