📅  最后修改于: 2023-12-03 14:39:44.007000             🧑  作者: Mango
在 C# 中,我们有时需要将一个列表(List)打乱顺序,以便在程序中进行随机操作。这时就可以使用 C# 的随机数生成器(Random)生成随机索引,然后交换对应位置的元素来实现列表的打乱。
下面是一个实现 List 打乱的示例代码:
public static void Shuffle<T>(this IList<T> list)
{
Random rng = new Random();
int n = list.Count;
while (n > 1)
{
n--;
int k = rng.Next(n + 1);
T value = list[k];
list[k] = list[n];
list[n] = value;
}
}
使用这个方法,我们可以轻松打乱一个 List 对象:
// 创建一个包含数字 1 到 5 的 List
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 打乱 List
numbers.Shuffle();
// 输出打乱后的结果
foreach (var number in numbers)
{
Console.Write(number + " ");
}
// 输出示例:2 4 1 5 3
这个方法使用了 Fisher-Yates 洗牌算法,该算法可以将一个有限的列表随机打乱,同时具有良好的随机性和均匀性。
在方法中,我们首先定义了一个 C# 的随机数生成器(Random),然后通过循环迭代中随机选取一个元素索引,交换随机选取的元素与列表末尾的元素,每次循环都递减 n 的值。这样就可以在 O(n) 的时间复杂度内打乱整个列表。
通过实现 Fisher-Yates 洗牌算法,我们可以轻松在 C# 中实现列表的随机打乱。基于这个方法,我们可以扩展,进行更加复杂的随机操作。