副标题 / 摘要

生成不重复随机序列的标准方法是洗牌。本文说明原理并提供可运行实现。

目标读者

  • 学习随机算法的开发者
  • 需要抽样与随机化的工程师
  • 算法面试准备者

背景 / 动机

随机且不重复是很多场景的基础能力,例如抽奖、打乱顺序、采样。
洗牌算法能保证均匀分布且复杂度可控。

核心概念

  • 均匀随机:所有排列等概率
  • 洗牌(Fisher-Yates):线性时间打乱
  • 采样:在大规模集合中取子集

实践指南 / 步骤

  1. 初始化序列
  2. 从尾到头随机交换
  3. 保证每一步的随机性
  4. 输出最终序列

可运行示例

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] 中的元素交换。
这样可保证所有排列等概率出现。

常见问题与注意事项

  1. 能否用 sort + random key?
    不建议,分布不一定均匀。

  2. 是否需要固定随机种子?
    测试时建议固定,生产可随机。

  3. 大规模采样如何做?
    可用水塘抽样或分块采样。

最佳实践与建议

  • 使用标准洗牌算法
  • 对随机性敏感场景做统计验证
  • 避免使用非均匀的随机方法

小结 / 结论

洗牌法是生成不重复随机序列的经典方案,线性复杂度且分布均匀。
它适合多数工程场景。

参考与延伸阅读

  • Fisher-Yates Shuffle
  • Random Sampling Algorithms

元信息

  • 阅读时长:5~7 分钟
  • 标签:随机、洗牌
  • SEO 关键词:随机序列, Fisher-Yates
  • 元描述:讲解不重复随机序列的生成方法。

行动号召(CTA)

生成 1~100 的随机排列,并写脚本统计分布是否均匀。