Fisher-Yates洗牌算法(也称为Knuth洗牌算法)是计算机科学中最经典、最高效的数组随机化算法。在Unity游戏开发中,它被广泛应用于卡牌游戏、抽奖系统、随机关卡生成等需要公平随机的场景。
为什么选择Fisher-Yates?
-
数学上完美公平:保证每个元素出现在任意位置的概率都是 1/n
-
时间效率最优:O(n) 时间复杂度,只需遍历一次
-
空间效率最优:O(1) 空间复杂度,原地洗牌
-
实现简单直观:代码不到10行,易于理解和维护
算法核心原理
基本思想
Fisher-Yates算法的核心思想非常简单:从后往前遍历数组,每次将当前位置的元素与"当前位置到数组末尾"之间的随机位置进行交换。
想象你有一副扑克牌,洗牌的过程是:
-
从最后一张牌开始
-
在"当前位置到最后一张"之间随机选一张,与当前位置交换
-
移到倒数第二张,重复上述过程
-
直到处理完所有牌
这样每张牌都有均等的机会出现在任意位置。
1.2 数学证明(为什么是公平的)
证明每个元素出现在任意位置的概率都是 1/n:
假设数组有 n 个元素,考虑元素 A 出现在位置 k 的概率:
元素 A 在位置 k 的概率 = 前 (n-k-1) 次不被选中 × 第 (n-k) 次被选中
计算过程:
- 第 n 次迭代(最后一个位置):A 被选中的概率 = 1/n
- 第 n-1 次迭代:A 不被选中的概

最低0.47元/天 解锁文章
8183

被折叠的 条评论
为什么被折叠?



