Code 【Knuth洗牌算法】如何在多个值中不重复的抽取任意个数? 编程 算法 C# 11次访问 01-26 19:53 有时我们在随机生成上会遇到一个问题,如果我们需要从多个值中**不重复**的**随机的**抽出**任意**个参数。 例如如何从8张卡牌中公平的抽取4张,且不重复。 那么洗牌算法是最好的选择。 洗牌算法,顾名思义就是如同洗牌一样将一组数据的顺序打乱。 ```csharp public class Utility : MonoBehaviour { //knuth洗牌算法 public static T[] Knuth(T[] _datelist) { for (int i = 0; i < _datelist.Length; i++) { int randomNum = Random.Range(0, _datelist.Length);//随机生成一个下标 T temp = _datelist[i]; _datelist[i] = _datelist[randomNum]; _datelist[randomNum] = temp; } return _datelist; } } ``` [========] ####算法思想 1. 在数组中随机选择一个元素 1. 将该元素与 **第一个** 元素位置互换 1. 在数组中随机选择一个元素 1. 将该元素与 **第二个** 元素位置互换 1. 直到与最后一个元素位置互换 这样,我们就能将一个数组的元素全部打乱。 最后将它转换为队列,想要多少个数据直接出队多少次即可。 ####是否足够公平 假设有三张牌**A B C** P(B)=**1/3**,B就此不参与选择。 此时我继续从A,C中选择,假设选中A. 即P(A)=2/3***** 1/2=**1/3** 所以,每张卡片的位置概率都是相等的。 ####复杂度 整个算法的时间复杂度为O(n),空间复杂度为O(1)。 < CSS实现动态导航栏 【心情】学习兴趣下降ing > 让浏览器记住我!