news 2026/9/24 6:26:11

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/9/22 5:19:38

SillyTavern终极实战指南:从零配置到高级应用的完整解决方案

SillyTavern终极实战指南:从零配置到高级应用的完整解决方案 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern SillyTavern作为专为AI聊天和角色扮演设计的强大前端工具&#xff…

作者头像 李华
网站建设 2026/9/20 17:25:29

轻量级AI翻译方案:CPU环境下的高性能中英互译

轻量级AI翻译方案:CPU环境下的高性能中英互译 🌐 AI 智能中英翻译服务 (WebUI API) 在跨语言交流日益频繁的今天,高质量、低延迟的自动翻译系统已成为开发者和企业不可或缺的工具。然而,许多现有的翻译服务依赖GPU加速或云端API调…

作者头像 李华
网站建设 2026/9/22 21:24:31

5分钟上手XUnity Auto Translator:游戏翻译终极指南

5分钟上手XUnity Auto Translator:游戏翻译终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂外语游戏而烦恼吗?XUnity Auto Translator是专为Unity游戏打造的自…

作者头像 李华
网站建设 2026/9/21 20:42:17

DLSS Swapper实战指南:从入门到精通的DLSS管理艺术

DLSS Swapper实战指南:从入门到精通的DLSS管理艺术 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在当今游戏图形技术快速发展的时代,DLSS(深度学习超级采样)已成为提升…

作者头像 李华
网站建设 2026/9/21 20:23:37

零基础部署AI翻译服务:Flask Web集成镜像快速上手教程

零基础部署AI翻译服务:Flask Web集成镜像快速上手教程 🌐 AI 智能中英翻译服务 (WebUI API) 从零开始的本地化AI翻译部署实践 你是否曾为项目中的中英文互译任务烦恼?商业API成本高、响应慢,开源模型又难部署?本文…

作者头像 李华
网站建设 2026/9/20 17:21:11

百度网盘下载提速终极指南:告别龟速的完整解决方案

百度网盘下载提速终极指南:告别龟速的完整解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘几十KB/s的下载速度而烦恼吗?面对重要…

作者头像 李华