在我的程序中,我有一个函数可以找到最接近整数的索引。
var indexWinnder = Array.IndexOf(scoreArray, nearestScore)
但是Array.IndexOf
的工作方式是找到第一个匹配项并使用它。我想要一个随机索引。不是第一个。不是最后的。有什么办法可以做到这一点?
那么,如果只有一个索引会怎样?您必须创建一些自定义代码才能做到这一点。
您可以找到所有索引并返回一个数组
List<int> indexes = new List<int>();
var index = 0;
while (index!=-1) {
index = Array.IndexOf(scoreArray, nearestScore, index);
if(index != -1) indexes.Add(index);
}
Random random = new Random();
var randomIndex = indexes[random.Next(indexes.Count) - 1];
没有内置方法,但是您可以使用自己的方法。我的示例使用了可能实现的通用版本。
class Program
{
static void Main(string[] args)
{
var arr = new int[] { 1, 2, 3, 1, 1, 5, 2, 6, 1 };
var randomIndex = RandomIndexOf(arr, 1);
Console.WriteLine(randomIndex);
Console.ReadKey();
}
static int RandomIndexOf<T>(ICollection<T> arr, T element)
{
var indexes = arr.Select((x, i) => new { Element = x, Index = i })
.Where(x => element.Equals(x.Element))
.Select(x => x.Index)
.ToList();
if (indexes.Count == 0) // there is no matching elements
{
return -1;
}
var rand = new Random();
var randomIndex = rand.Next(0, indexes.Count);
return indexes[randomIndex];
}
}
另一个选项可以过滤给定分数的所有索引,然后按随机值排序(例如Guid.NewGuid()
)并获得第一项作为索引
var arr = new[] { 1, 2, 3, 2, 5, 6, 2, 3, 5, 6, 7, 8 };
int score = 2;
var indices = new List<int>();
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] == score)
indices.Add(i);
}
var randomIndex = indices.OrderBy(i => Guid.NewGuid()).FirstOrDefault();
也许这就是您想要的:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
int[] sampleArray = new int[] { 1, 2, 3, 2, 1, 3, 1, 2, 3 };
var indices = getAllIndices(sampleArray, i => i == 2);
var rnd = new Random();
var randomIndex = rnd.Next(0, indices.Count());
Console.WriteLine(randomIndex);
Console.ReadLine();
}
static IEnumerable<int> getAllIndices(int[] array, Predicate<int> predicate)
{
for (var i = 0; i < array.Length; i++)
{
if (predicate(array[i]))
yield return i;
}
}
}
HTH
不要忘记检查空数组,空参数等。
我不知道我是否正确理解了您的问题,但是如果您只是想要一个随机索引,您可以编写一个方法并使用:
Random rnd = new Random();
int index = rnd.Next(MinValue, MaxValue); // e.g: MinValue: 0, MaxValue: Length of the Array
然后仅使用该索引作为数组索引。
如果您确实想要随机的,则随机不是最佳选择,因为它遵循一种特定的模式,这种模式会一次又一次地出现。如果你想要更多随机的东西,你可以看看RNGCryptoServiceProvider:https://www.dotnetperls.com/rngcryptoserviceprovider。希望这会有所帮助!