侵权投诉

浅析Knuth高效洗牌算法

算法与数据结构 2021-04-26 15:41 次阅读

今天在做一个游戏需求的时候碰到一个问题,问题很简单,给定75个球,编号1-75,需要保证初始化的时候位置是随机的。

显然,我们可以初始化一个数组A,把75个数放进去,然后做一个shuffle函数随机交换其中的元素,这样就是随机的。

我准备这样做一个shuffle,但同时也想看看golang里面是否有这样的接口直接得到结果,看了下还真有,这个函数是rand.Perm(n),这个函数会返回一个数组,比如我传入75,会返回一个0-74的随机数组。

arr := rand.Perm(75)

好奇心驱使我一探究竟,golang会用什么样的方式实现Perm函数呢?

打开golang的源代码,在rand.go文件中找到这个函数:

8722762c-a4b3-11eb-aece-12bb97331649.png

实现很简单,然而初一看有点懵,因为没有用到shuffle,而是一次遍历就把事情给解决了,到底是怎么回事?

仔细分析发现,这个算法非常精巧,每次遍历都是将当前的数i和已经在数组中的随机一个数m[j]进行交换,最终达到了公平随机整个数组的作用。虽然只有短短3行代码,却让人有种震撼的感觉。

顿时觉得golang很NB,确实很高效。

上面这段代码写了4行的注释,大概意思是说不能省去0那一次,看起来没啥用处,但是为了照顾r随机器中的随机序列,还是要加上,不然可能会造成负作用,这里面和随机种子以及此后随机的序列有关,为了对随机序列不产生影响保证公平性,不能省略0。

网上搜索了一下高效洗牌算法,又发现python里面也有这样的函数,这样写的:

for(int i = N - 1; i 》= 0 ; i -- )

swap(arr[i], arr[rand(0, i)]) // rand(0, i) 生成 [0, i] 之间的随机整数

而这个算法的出处竟然来自于TAOCP!算法就是大名鼎鼎的 Knuth-Shuffle,即 Knuth 洗牌算法。

看似简单的问题,竟然又扯出Knuth,大意了。

能把一件小事情做到极致的人,可以称之为艺术家。Knuth名副其实。

最后以Knuth的一句话共勉:

A programmer who subconsciously views himself as an artist will enjoy what he does and will do it better.

Donald E. Knuth 1978
编辑:lyn

原文标题:Knuth高效洗牌算法

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

解析C语言结构体字节如何对齐

01 默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问....
的头像 电子发烧友网工程师 发表于 06-12 17:42 20次 阅读
解析C语言结构体字节如何对齐

简述那些JDK中坑你没商量的方法

前言 JDK 作为我们每天必备的调用类库,里面大量提供了基础类供我们使用。可以说离开 JDK ,我们....
的头像 电子发烧友网工程师 发表于 06-12 17:36 17次 阅读
简述那些JDK中坑你没商量的方法

浅谈RTL设计风格及Verilog编码规范

一、同步设计 1.1 时钟的同步设计 关注问题: (1)设计中尽可能使用单时钟和单时钟边沿触发 (2....
的头像 FPGA之家 发表于 06-12 17:20 16次 阅读
浅谈RTL设计风格及Verilog编码规范

带延迟调整的脉冲神经元学习算法

脉冲神经元有监督学习算法通过梯度下降法调整神经元的突触权值,但目标学习序列长度的增加会降低其精度并延....
发表于 06-11 16:37 9次 阅读
带延迟调整的脉冲神经元学习算法

动态学习机制的双种群蚁群算法综述

动态学习机制的双种群蚁群算法综述
发表于 06-11 16:27 4次 阅读
动态学习机制的双种群蚁群算法综述

多关系网络的社团结构发现算法综述

多关系网络的社团结构发现算法综述
发表于 06-11 16:18 5次 阅读
多关系网络的社团结构发现算法综述

基于特征聚类信息的二进制粒子群优化算法

基于特征聚类信息的二进制粒子群优化算法
发表于 06-11 15:38 8次 阅读
基于特征聚类信息的二进制粒子群优化算法

基于boosting框架的混合秩矩阵分解模型

基于boosting框架的混合秩矩阵分解模型
发表于 06-11 14:41 6次 阅读
基于boosting框架的混合秩矩阵分解模型

基于贝叶斯网络和攻击图的评估算法

为准确评估计算机网络的脆弱性,结合贝叶斯网络与攻击图提出一种新的评估算法。构建攻击图模型RSAG,在....
发表于 06-11 14:23 3次 阅读
基于贝叶斯网络和攻击图的评估算法

一个函数究竟能不能超过50行呢?

有些读者可能看到过类似这样的描述,而自己做项目时,很多函数都比较多(超过50行),就会怀疑自己这样写....
的头像 strongerHuang 发表于 06-11 12:46 112次 阅读
一个函数究竟能不能超过50行呢?

基于实时特征检测等的AR系统三维注册方法

针对增强现实(AR)系统在进行虚拟信息叠加时待注册区域被遮挡的情况,提岀一种基于实时特征检测与目标跟....
发表于 06-11 11:34 5次 阅读
基于实时特征检测等的AR系统三维注册方法

基于动态解耦的软件众包任务分解算法综述

综合考虑任务粒度与解耦水平,提出一种改进的软件众包任务分解算法。基于任务网络内的依赖关系计算任务粒度....
发表于 06-11 11:13 5次 阅读
基于动态解耦的软件众包任务分解算法综述

面向CU和PU模式选择的SCC帧间快速算法

为降低屏幕内容编码的计算复杂度,提出一种针对编码单元(CU)划分和预测单元(PU)模式选择的快速算法....
发表于 06-11 10:41 7次 阅读
面向CU和PU模式选择的SCC帧间快速算法

基于模糊优势的粗糙集聚类定性组合算法

为对包含数值和名词属性的混合数据集进行定性组合聚类分析,提出一种基于模糊优势关系的粗糙聚类定性组合算....
发表于 06-11 10:38 5次 阅读
基于模糊优势的粗糙集聚类定性组合算法

基于区域分割的地震预测混合型算法

由于地震区域地质结构的差异性,采用单一模型难以在分割后的所有小区域都达到较好的预测效果。为此,提出一....
发表于 06-11 10:17 16次 阅读
基于区域分割的地震预测混合型算法

Immervision针对LG Electronics提出的质疑,其已成功捍卫其专利

2018年,Immervision就LG在多款智能手机中采用广角摄像头技术对其提出专利侵权民事诉讼。....
的头像 MEMS 发表于 06-11 09:30 98次 阅读
Immervision针对LG Electronics提出的质疑,其已成功捍卫其专利

ios15正式版发布时间 什么时候发布

6月8号凌晨,苹果举行了一年一度的WWDC21开发者大会,发布了全新的iOS15、iPadOS 15....
的头像 牵手一起梦 发表于 06-11 09:25 2412次 阅读
ios15正式版发布时间 什么时候发布

一步一步教你如何去发布Python项目开源包?

注意:本文假设你在 GitHub 上已经有一个想要打包和发布的项目。
的头像 马哥Linux运维 发表于 06-10 14:22 52次 阅读
一步一步教你如何去发布Python项目开源包?

包含时空信息特征的视频指纹算法

为满足视频拷贝检测系统的鲁棒性、独特性和紧凑性,提出一种包含时空信息特征的视频指纹算法。利用时空切片....
发表于 06-10 11:20 7次 阅读
包含时空信息特征的视频指纹算法

无线传感器网络的非均匀拓扑控制算法

针对无线传感器网络中节点能量有限以及消耗不均衡的问题,运用势博弈理论,设计一种考虑节点剩余能量、信息....
发表于 06-10 11:17 8次 阅读
无线传感器网络的非均匀拓扑控制算法

基于机器学习的哈希检索算法综述

基于机器学习的哈希检索算法综述
发表于 06-10 11:05 10次 阅读
基于机器学习的哈希检索算法综述

基于特征融合的LCT目标跟踪算法综述

为解决LCT算法在目标形变与快速移动情况下跟踪效果差的问题,提出一种基于特征融合的跟踪算法。在梯度方....
发表于 06-10 10:53 4次 阅读
基于特征融合的LCT目标跟踪算法综述

微型环境监测站哪家好

微型环境监测站【霍尔德HED-APEG-AQ1】主要由气态污染物检测模块、颗粒物检测模块、气象参数传....
发表于 06-10 09:55 59次 阅读
微型环境监测站哪家好

世界上最先进分布式版本控制系统Git介绍

前言 Git是目前最流行的版本控制工具,Linux,Android都是使用git进行管理。Githu....
的头像 FPGA之家 发表于 06-09 17:40 144次 阅读
世界上最先进分布式版本控制系统Git介绍

基于图像显著性识别的自动抠图系统设计

RC算法引人区域级别的对比度,对颜色模型进行重新量化,能大幅提高处理速度、突出显著目标,然而其基于图....
发表于 06-09 16:36 16次 阅读
基于图像显著性识别的自动抠图系统设计

基于循环神经网络的电影推荐算法

传统电影推荐算法多数基于用户和电影的静态属性进行推荐,忽略了时间序列数据内在的时间和因果因素,推荐质....
发表于 06-09 16:33 6次 阅读
基于循环神经网络的电影推荐算法

第七届硬创大赛与天安数码城达成战略合作 携手共孵行业未来领军企业

日前,中国硬件创新创客大赛组委会与天安数码城(集团)有限公司正式签署双方战略合作协议,达成战略合作伙....
的头像 中国硬件创新大赛 发表于 06-09 16:27 226次 阅读
第七届硬创大赛与天安数码城达成战略合作 携手共孵行业未来领军企业

栈式降噪自动编码器的动态混合推荐算法

传统协同过滤算法仅依靠用户评分数据的低维向量方法,存在推荐结果精确度低以及冷启动问题。为此,提出一种....
发表于 06-09 15:48 10次 阅读
栈式降噪自动编码器的动态混合推荐算法

在目前深度学习中比较普及的“物件检测”应用

接下来的重点,就是在目前深度学习中比较普及的“物件检测”应用,重点主要有以下三部分: 1. 简单说明....
的头像 NVIDIA英伟达企业解决方案 发表于 06-09 15:46 121次 阅读
在目前深度学习中比较普及的“物件检测”应用

计算机软件的迁移路径自动生成

计算机软件在军用装备中所占比重越来越大,软件质量的好坏决定着装备质量的高低,而软件测试则是提高软件质....
发表于 06-09 15:35 6次 阅读
计算机软件的迁移路径自动生成

复杂网络下的局部路径链路预测算法

复杂网络下的局部路径链路预测算法
发表于 06-09 15:33 7次 阅读
复杂网络下的局部路径链路预测算法

基于XGBoost的树突状细胞算法综述

树突状细胞算法(DCA)要求输入3类信号,需要通过人工选取或统计学等方式提前进行特征提取。为准确、高....
发表于 06-09 14:48 9次 阅读
基于XGBoost的树突状细胞算法综述

一种抗能量的椭圆曲线密码标量乘算法

为在资源受限的安全芯片中兼顾标量乘运算的安全性与效率,设计一种抗能量分析攻击的椭圆曲线密码标量乘算法....
发表于 06-09 14:45 8次 阅读
一种抗能量的椭圆曲线密码标量乘算法

面向Web服务器的随机种子调度算法

调度是拟态构造Web服务器的重要机制,现有的调度算法多数缺乏对拟态构造Web服务器异构性和Web服务....
发表于 06-09 14:23 9次 阅读
面向Web服务器的随机种子调度算法

权重模糊粗糙集的改进规则挖掘算法

针对粗糙集分类规则挖掘算法LEM剪枝条件过于严格的冋题,提岀一种杈重模糊粗糙集的改进规则挖掘算法。在....
发表于 06-09 11:48 11次 阅读
权重模糊粗糙集的改进规则挖掘算法

融合生成对抗网络等的皮肤病诊断技术

不同皮肤病间发病率的差异导致了皮肤病数据类不平衡现象,对使用机器学习方法构建高效、准确的皮肤病诊断模....
发表于 06-09 11:44 8次 阅读
融合生成对抗网络等的皮肤病诊断技术

浅析图解算法之冒泡排序

03 冒泡排序 为描述方便,用下面的数组模拟小朋友的交换过程。 核心思想(升序): 从首位置开始,依....
的头像 Linux爱好者 发表于 06-08 16:43 85次 阅读
浅析图解算法之冒泡排序

WSN的动态分簇安全数据汇聚算法

为在无线传感器网络(WSN)的数据收集、处理和传输过程中降低能耗,提高数据的安全性与机密性,提出种动....
发表于 06-08 16:36 36次 阅读
WSN的动态分簇安全数据汇聚算法

基于蒙特卡洛的两阶段极化码构造方法

为快速构造髙维核矩阵极化码,提岀一种基于蒙特卡洛(MC)的两阶段极化码构造方法TPMC。在第1阶段,....
发表于 06-08 16:04 7次 阅读
基于蒙特卡洛的两阶段极化码构造方法

基于权重矩阵分解的在线多任务学习算法

在线多任务学习(MTL)算法大多利用单个权重矩阵约束任务相关性,且该约東较为严格,在实践中难为此,提....
发表于 06-08 15:58 5次 阅读
基于权重矩阵分解的在线多任务学习算法

异构有向传感器网络的改进差分进化算法

为提高异构有向传感器网络的节点调度效率,基于学习自动机提出一种参数自适应的差分进化算法。将节点调度问....
发表于 06-08 14:44 7次 阅读
异构有向传感器网络的改进差分进化算法

基于预算分配的云计算科学工作流调度方法

云环境下的科学工作流部署不同于传统的独立任务调度,需同步考虑调度代价与时间问题。为此,提出基于预算分....
发表于 06-08 14:34 5次 阅读
基于预算分配的云计算科学工作流调度方法

51步RIPEMD-160区分攻击的复杂度综述

SASAKI Y等人使用消息修改技术对51步 RIPEMD-160算法进行区分攻击时( Lectur....
发表于 06-08 14:19 8次 阅读
51步RIPEMD-160区分攻击的复杂度综述

WSN中的能量优化分簇路由算法

无线传感器网络中的节点存在电源能量有限的问题,极大地影响了网络节点使用寿命。为此,提出一种基于多因素....
发表于 06-08 11:37 13次 阅读
WSN中的能量优化分簇路由算法

WSN的改进蚁群能量优化路由算法

无线传感器网络存在能耗不均的问题,且Sink节点周围的“热”节点会因负载重而过早死亡。针对该问题,提....
发表于 06-08 11:32 6次 阅读
WSN的改进蚁群能量优化路由算法

基于FPGA的AES算法中S-box和列混合单元优化

基于FPGA的AES算法中S-box和列混合单元优化
发表于 06-08 10:52 11次 阅读
基于FPGA的AES算法中S-box和列混合单元优化

请教一下怎样用定点DSP去实现MP3编码算法?

MP3编码算法的原理是什么? 如何对MP3编码算法进行优化? 怎样用定点DSP去实现MP3编码算法?...
发表于 06-08 07:15 0次 阅读
请教一下怎样用定点DSP去实现MP3编码算法?

求一种基于ARM的视频监控系统的设计方案

本文介绍了一种基于ARM的视频监控系统的设计方案,采用软压缩算法,讨论了系统的硬件和软件设计。...
发表于 06-08 06:27 0次 阅读
求一种基于ARM的视频监控系统的设计方案

戴着镣铐起舞的算法市场 算法产业的参差有多大

世界的参差究竟有多大? 2007年iPhone发布,还没有第三方应用,被嘲笑“居然连贪吃蛇都玩不了”....
的头像 脑极体 发表于 06-07 21:46 553次 阅读
戴着镣铐起舞的算法市场 算法产业的参差有多大

基于语义耦合相关的判别式跨模态哈希学习算法

基于语义耦合相关的判别式跨模态哈希学习算法
发表于 06-07 16:36 13次 阅读
基于语义耦合相关的判别式跨模态哈希学习算法

NTRU全同态掩码防御密码方案

为了抵抗量子计算机的攻击,相关的后量子密码算法被先后提出.NTRU( Number Theory R....
发表于 06-07 16:27 10次 阅读
NTRU全同态掩码防御密码方案

基于单分类的演化算法预选择策略OCPS

基于单分类的演化算法预选择策略OCPS
发表于 06-07 16:07 12次 阅读
基于单分类的演化算法预选择策略OCPS

贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?

贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?...
发表于 06-07 07:16 0次 阅读
贴片压敏电阻常用封装可以用哪几种尺寸代码来表示?

什么是分簇多跳算法?其有什么优势?

本文提出了一种基于能量和距离的分簇多跳算法。...
发表于 06-07 06:36 0次 阅读
什么是分簇多跳算法?其有什么优势?

三种视频编码标准的对比与选择

视频编解码标准分为哪几种?
发表于 06-07 06:17 0次 阅读
三种视频编码标准的对比与选择

请问怎样去设计一种MPEG-4 加速器?

如何去选择并优化IDCT快速算法? 怎样去设计一种MPEG-4加速器? 如何对MPEG-4加速器进行仿真验证? ...
发表于 06-04 07:20 0次 阅读
请问怎样去设计一种MPEG-4 加速器?

介绍一种H.264编码中帧间模式选择的算法

本文提出了一种H.264编码中帧间模式选择的算法,并针对该算法给出了4种计算阈值的方法。...
发表于 06-04 07:17 0次 阅读
介绍一种H.264编码中帧间模式选择的算法

如何去实现一种4x4整数变换的快速算法?

本文提出一种基于TM1300的4x4整数变换的快速算法,使用了并行算是技术大大减少了计算量。...
发表于 06-04 06:41 0次 阅读
如何去实现一种4x4整数变换的快速算法?

3D图像生成算法的原理是什么?

什么是3D图形芯片? 3D图像生成算法的原理是什么? ...
发表于 06-04 06:29 0次 阅读
3D图像生成算法的原理是什么?

基于GFO算子的图像增强算法如何去实现?

基于GFO算子(广义模糊算子)的图像增强算法如何去实现? 怎样对图像增强算法进行分析? ...
发表于 06-04 06:24 0次 阅读
基于GFO算子的图像增强算法如何去实现?