Shuffle过程
Shuffle(随机重排)是计算机科学中用于将序列元素随机重新排列的过程。其核心目标是保证每个元素出现在任一位置的概率均等,即对于长度为n的序列,每个元素最终位于第i个位置的概率为\\frac{1}{n}。
Shuffle的本质基于磁盘划分来解决分布式大数据量的**全局分组、全局排序、重新分区【增大】**的问题。
经典算法:费雪耶茨洗牌(Fisher-Yates Shuffle)
该算法通过逐步交换元素实现高效随机化:
- 从最后一个元素开始向前遍历
- 对当前元素i(从n-1到0),随机选择索引j(0 \\leq j \\leq i)
- 交换位置i与j的元素
数学表达: $$ P(\text{元素移至位置}k) = \prod_{m=k}^{n-1} \frac{m}{m+1} \times \frac{1}{k} = \frac{1}{n} $$
import random
def fisher_yates_shuffle(arr):
n = len(arr)
for i in range(n-1, 0, -1):
j = random.randint(0, i)
arr[i], arr[j] = arr[j], arr[i]
return arr
特性:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
- 无偏性:每个排列出现的概率均为\\frac{1}{n!}
应用场景
- 机器学习数据集随机化
- 卡牌游戏发牌
- 随机实验分组
- 密码学中的随机序列生成
注意:实际实现需使用密码学安全的随机数生成器(如CSPRNG)以保证不可预测性。