0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析Knuth高效洗牌算法

算法与数据结构 来源:ACM算法日常 作者:ACM算法日常 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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4761

    浏览量

    97146
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • Shuffle
    +关注

    关注

    0

    文章

    5

    浏览量

    1890

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SM4算法实现分享(一)算法原理

    SM4分组加密算法采用的是非线性迭代结构,以字为单位进行加密、解密运算,每次迭代称为一轮变换,每轮变换包括S盒变换、非线性变换、线性变换、合成变换。加解密算法与密钥扩展都是采用32轮非线性迭代结构
    发表于 10-30 08:10

    SM4算法原理及分享1

    SM4算法是一种分组密码算法。其分组长度为128bit,密钥长度也为128bit。加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭代运算均
    发表于 10-30 06:54

    国密系列算法简介及SM4算法原理介绍

    一、 国密系列算法简介 国家商用密码算法(简称国密/商密算法),是由我国国家密码管理局制定并公布的密码算法标准。其分类1所示: 图1 国家商用密码
    发表于 10-24 08:25

    加密算法的应用

    加密是一种保护信息安全的重要手段,近年来随着信息技术的发展,加密技术的应用越来越广泛。本文将介绍加密算法的发展、含义、分类及应用场景。 1. 加密算法的发展 加密算法的历史可以追溯到古代。在
    发表于 10-24 08:03

    DFT算法与FFT算法的优劣分析

    一概述 在谐波分析仪中,我们常常提到的两个词语,就是DFT算法与FFT算法,那么一款功率分析仪/谐波分析仪采用DFT算法或者FFT算法,用户往往关注的是能否达到所要分析谐波次数的目的,
    的头像 发表于 08-04 09:30 894次阅读

    【HarmonyOS next】ArkUI-X休闲益智猜字谜【基础】

    ) { // 类似题目随机算法 } 通过Fisher-Yates洗牌算法实现高效随机,避免题目重复。 3. 跨端UI构建 build() { Column() { // 得分&am
    发表于 06-26 20:01

    同步电机失步浅析

    纯分享帖,需要者可点击附件免费获取完整资料~~~*附件:同步电机失步浅析.pdf【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 06-20 17:42

    首获CCC认证,千亿充电桩市场加速洗牌

    谁能在洗牌中握紧入场券,将成为下半场竞争的关键悬念。
    的头像 发表于 05-30 17:15 809次阅读

    智慧路灯智能控制算法优化的探讨

    ,能够高效应对复杂且存在不确定性的环境条件。以采用 Python 语言编写的模糊控制算法为例,该算法能够实时采集环境光强以及车流量数据,在此基础上动态调控路灯亮度。这一举措不仅显著提升了能源利用效率,还能确保照明效果在舒适性
    的头像 发表于 03-07 11:39 651次阅读
    智慧路灯智能控制<b class='flag-5'>算法</b>优化的探讨

    中伟视界:AI防爆型摄像机有哪些常用算法算法解析与并行运行能力介绍

    AI防爆型摄像机通过多种智能算法,如目标检测、人体识别、行为识别等,具备了对监控场景的深度解析与高效管理能力。它能实时监测潜在危险并预警,在无网无电环境中可独立运行,充分展示了其强大的并行算法能力,成为安防和工业领域的重要工具。
    的头像 发表于 02-27 10:41 908次阅读
    中伟视界:AI防爆型摄像机有哪些常用<b class='flag-5'>算法</b>之<b class='flag-5'>算法</b>解析与并行运行能力介绍

    PID控制算法的C语言实现:PID算法原理

    在工业应用中 PID 及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握 PID 算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而
    发表于 02-26 15:24

    直击 MBR2054:低正向压降如何成就高效电路,应用实例解读#

    高效电路
    杰克船长6262
    发布于 :2025年02月22日 14:23:54

    设备智能巡检系统,高效精准定位设备隐患

    随着工业设备规模不断扩大、复杂度持续提升,传统人工巡检模式已难以满足高效、精准的隐患管理需求。中设智控推出的智能巡检系统,通过物联网、AI算法与大数据技术,实现设备隐患的“主动发现-智能诊断-闭环处置”,助力企业构建安全高效的设
    的头像 发表于 02-21 16:14 880次阅读
    设备智能巡检系统,<b class='flag-5'>高效</b>精准定位设备隐患

    信道分配算法在通信中的应用

    在现代通信系统中,信道分配算法是确保有效、高效通信的关键技术之一。随着移动通信技术的快速发展,用户数量的增加和数据流量的爆炸式增长,对信道资源的需求也在不断上升。 信道分配算法的基本概念 信道分配
    的头像 发表于 01-22 16:22 1188次阅读

    常见的加密算法有哪些?它们各自的优势是什么?

    在于其出色的安全性能和高效的实现方式,已成为目前最广泛使用的加密算法之一。它能够抵御暴力破解攻击,且在各种硬件和软件平台上都能实现高效的加密和解密操作。 DES(Data Encryption
    的头像 发表于 12-17 15:57 1729次阅读