news 2026/4/3 2:46:23

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/3/29 5:44:18

LOL自定义界面美化终极指南:从技术原理到实战操作完整解析

LOL自定义界面美化终极指南:从技术原理到实战操作完整解析 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要让英雄联盟客户端界面焕然一新?LeaguePrank这款基于LCU API的界面自定义工具能够帮你实现…

作者头像 李华
网站建设 2026/3/27 6:09:23

DownKyi:轻松构建个人B站视频资源库的完整指南

DownKyi:轻松构建个人B站视频资源库的完整指南 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等)。…

作者头像 李华
网站建设 2026/3/31 14:28:01

XUnity自动翻译器:打破游戏语言壁垒的终极解决方案

XUnity自动翻译器:打破游戏语言壁垒的终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的陌生文字而烦恼吗?XUnity自动翻译器为你开启无障碍游戏体验的…

作者头像 李华
网站建设 2026/4/1 10:50:01

CSANMT模型API限流与配额管理实现方案

CSANMT模型API限流与配额管理实现方案 📌 背景与挑战:AI智能中英翻译服务的高并发需求 随着全球化进程加速,跨语言沟通需求激增。本项目基于达摩院CSANMT神经网络翻译模型构建了轻量级、高性能的中英翻译服务,支持WebUI交互与API调…

作者头像 李华
网站建设 2026/4/1 19:37:43

SillyTavern实战宝典:解锁AI聊天与角色扮演的终极配置秘籍

SillyTavern实战宝典:解锁AI聊天与角色扮演的终极配置秘籍 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 想要打造专业级的AI聊天体验吗?SillyTavern作为专为高级用…

作者头像 李华