C# 从没有重复元素的数组字符串中随机获取8个元素值
我有一个长度为100的字符串数组。 我想在100个元素中随机获得8个元素,而不需要在C#中重复元素。 请帮帮我。 我很感激。 我只是使用: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
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);