随机生成不重复序列:洗牌法与采样法
副标题 / 摘要 生成不重复随机序列的标准方法是洗牌。本文说明原理并提供可运行实现。 目标读者 学习随机算法的开发者 需要抽样与随机化的工程师 算法面试准备者 背景 / 动机 随机且不重复是很多场景的基础能力,例如抽奖、打乱顺序、采样。 洗牌算法能保证均匀分布且复杂度可控。 核心概念 均匀随机:所有排列等概率 洗牌(Fisher-Yates):线性时间打乱 采样:在大规模集合中取子集 实践指南 / 步骤 初始化序列 从尾到头随机交换 保证每一步的随机性 输出最终序列 可运行示例 import random def shuffle(nums): for i in range(len(nums) - 1, 0, -1): j = random.randint(0, i) nums[i], nums[j] = nums[j], nums[i] return nums if __name__ == "__main__": nums = list(range(1, 11)) print(shuffle(nums)) 解释与原理 Fisher-Yates 在第 i 步随机选择 [0..i] 中的元素交换。 这样可保证所有排列等概率出现。 常见问题与注意事项 能否用 sort + random key? 不建议,分布不一定均匀。 是否需要固定随机种子? 测试时建议固定,生产可随机。 ...