副标题 / 摘要
生成不重复随机序列的标准方法是洗牌。本文说明原理并提供可运行实现。
目标读者
- 学习随机算法的开发者
- 需要抽样与随机化的工程师
- 算法面试准备者
背景 / 动机
随机且不重复是很多场景的基础能力,例如抽奖、打乱顺序、采样。
洗牌算法能保证均匀分布且复杂度可控。
核心概念
- 均匀随机:所有排列等概率
- 洗牌(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?
不建议,分布不一定均匀。是否需要固定随机种子?
测试时建议固定,生产可随机。大规模采样如何做?
可用水塘抽样或分块采样。
最佳实践与建议
- 使用标准洗牌算法
- 对随机性敏感场景做统计验证
- 避免使用非均匀的随机方法
小结 / 结论
洗牌法是生成不重复随机序列的经典方案,线性复杂度且分布均匀。
它适合多数工程场景。
参考与延伸阅读
- Fisher-Yates Shuffle
- Random Sampling Algorithms
元信息
- 阅读时长:5~7 分钟
- 标签:随机、洗牌
- SEO 关键词:随机序列, Fisher-Yates
- 元描述:讲解不重复随机序列的生成方法。
行动号召(CTA)
生成 1~100 的随机排列,并写脚本统计分布是否均匀。