news 2026/6/14 18:56:18

Fisher-Yates 洗牌算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Fisher-Yates 洗牌算法

Fisher-Yates 洗牌算法(又称 Knuth 洗牌算法)是一种能生成有限序列无偏全排列的高效随机化算法,现代版为原地操作,时间复杂度 O (n)、空间复杂度 O (1),由 Fisher 和 Yates 于 1938 年提出,经 Durstenfeld 与 Knuth 改进普及。


核心原理与步骤

核心是 “从后向前遍历,当前元素与前序随机位置交换”,确保每个元素到任意位置的概率均为 1/n,所有 n! 种排列等可能。

  1. 设数组长度为 n,索引从 0 到 n-1。
  2. 初始化 i = n - 1,向前遍历至 i = 1。
  3. 对每个 i,生成 [0, i] 内的均匀随机整数 j。
  4. 交换 arr [i] 与 arr [j]。
  5. i 减 1,重复至遍历结束。

伪代码

function fisherYatesShuffle(arr): n = arr.length for i from n-1 downto 1: j = random integer in [0, i] swap arr[i] and arr[j] return arr

代码实现(Python)

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 # 示例 if __name__ == "__main__": test_arr = [1, 2, 3, 4, 5] shuffled_arr = fisher_yates_shuffle(test_arr) print("Shuffled array:", shuffled_arr)

数学正确性(归纳法简述)

  • 基础步:n=1 时,唯一排列,概率 1,成立。
  • 归纳步:假设 n=k 时成立,当 n=k+1,第 k+1 个元素被换到位置 i 的概率为 1/(k+1);前 k 个元素仍保持均匀分布,故整体均匀。最终每个排列概率为 1/(n!)。

关键特性与对比

特性Fisher-Yates(现代)朴素洗牌(如每次全数组随机交换)
时间复杂度O(n)O (n)(但概率不均)
空间复杂度O (1)O(1)
无偏性是(所有排列等可能)否(概率偏倚)
适用场景数组、列表等可随机访问结构非严谨场景

常见误区与注意事项

  1. 随机数范围错误:若 j 取 [0, n-1] 而非 [0, i],会导致概率偏倚。
  2. 伪随机数质量:需使用高质量随机数生成器(如 Python 的 secrets 模块),避免周期过短或分布不均。
  3. 遍历方向:从后向前是为了原地操作,从前向后也可实现,但需额外空间或调整逻辑。

应用场景

游戏开发:打乱牌组、随机生成敌人位置、随机道具掉落顺序。

数据采样:无放回随机抽样、交叉验证中划分训练 / 测试集。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 21:50:48

G-Helper全面使用指南:释放华硕笔记本的隐藏性能

G-Helper全面使用指南:释放华硕笔记本的隐藏性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: ht…

作者头像 李华
网站建设 2026/6/6 15:31:07

快速上手游戏翻译:XUnity翻译器零基础实战指南

快速上手游戏翻译:XUnity翻译器零基础实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏而烦恼吗?想要轻松玩转日韩欧美游戏却苦于语言障碍?XUnit…

作者头像 李华
网站建设 2026/6/13 14:13:56

DLSS Swapper技术架构解析:游戏图形优化的多平台DLL管理方案

DLSS Swapper技术架构解析:游戏图形优化的多平台DLL管理方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在当今游戏图形技术快速迭代的背景下,玩家面临着游戏开发商更新滞后与最新DLSS技术无…

作者头像 李华
网站建设 2026/6/10 21:52:05

7个关键步骤:打造DLSS Swapper这样专业的Windows应用构建系统

7个关键步骤:打造DLSS Swapper这样专业的Windows应用构建系统 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 作为一款专业的DLSS管理工具,DLSS Swapper的构建系统展现了现代Windows应用程序开发…

作者头像 李华
网站建设 2026/5/30 21:09:12

XUnity Auto Translator:Unity游戏国际化翻译完整解决方案

XUnity Auto Translator:Unity游戏国际化翻译完整解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏内容而困扰吗?XUnity Auto Translator让语言障碍彻底成为…

作者头像 李华
网站建设 2026/6/13 12:14:30

高效突破付费墙:智能内容解锁终极秘籍

高效突破付费墙:智能内容解锁终极秘籍 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 您是否曾因为付费墙的限制而无法获取重要的专业内容?那些被标价的知识和…

作者头像 李华