我有一個字符串數組的長度爲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