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

    文章

    4800

    浏览量

    98505
  • 代码
    +关注

    关注

    30

    文章

    4975

    浏览量

    74349
  • Shuffle
    +关注

    关注

    0

    文章

    5

    浏览量

    1925

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    BLDC芯片(MDF101A)丨高精度、低噪音、高效率的水下推进控制方案

    ,相比传统有刷电机,效率与可靠性更高,同时避免电刷磨损与火花问题。 系统采用无传感器FOC(磁场定向控制)算法,实现高效率、低噪音及精准推力控制。MDF101A芯片内置高性能运算放大器与比较器,可减少
    发表于 04-07 15:56

    小华半导体数字电源算法配置工具DPACT介绍

    参考设计算法基础上完成定制化开发,高效生成符合项目需求的算法程序;用户几乎不需要懂电力电子算法、显著降低开发门槛、缩短产品上市周期、既提升开发效率又提升电源转换效率。
    的头像 发表于 02-11 11:28 441次阅读
    小华半导体数字电源<b class='flag-5'>算法</b>配置工具DPACT介绍

    GMSSL:国密算法SM2、SM3、SM4的高效实现

    GMSSL是一个支持国家密码算法(国密算法)的开源密码工具库,它提供了与OpenSSL类似的功能,但特别强化了国密算法支持,主要包括: 国密算法实现(SM2/SM3/SM4等); 证书
    的头像 发表于 01-05 20:59 585次阅读
    GMSSL:国密<b class='flag-5'>算法</b>SM2、SM3、SM4的<b class='flag-5'>高效</b>实现

    深入浅出GMSSL:掌握SM2、SM3、SM4国密算法高效实践

    将带你从零开始,深入理解这三大核心算法在GMSSL中的高效使用方式,帮助你在实际项目中快速落地国密安全方案。 本文将以通信定位二合一系列Air780EGH核心板为例,带你快速上手GMSSL国密算法SM2、SM3、SM4相关示例。
    的头像 发表于 12-12 18:20 869次阅读
    深入浅出GMSSL:掌握SM2、SM3、SM4国密<b class='flag-5'>算法</b>的<b class='flag-5'>高效</b>实践

    C语言的常见算法

    # C语言常见算法 C语言中常用的算法可以分为以下几大类: ## 1. 排序算法 ### 冒泡排序 (Bubble Sort) ```c void bubbleSort(int arr
    发表于 11-24 08:29

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

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

    Camellia算法的实现(基于开源蜂鸟E203协处理器)

    项目构想 我们一开始就选择信息安全作为芯来杯比赛方向,并以Camellia算法作为算法原型。借助蜂鸟E203的协处理,能加速Camellia算法的运算,并通过比较软件实现和硬件实现的效果,体现
    发表于 10-30 07:04

    SM4算法原理及分享1

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

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

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

    加密算法的应用

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

    AI的核心操控:从算法到硬件的协同进化

    到顶层的应用算法,共同构成AI的“智能引擎”。 算法层:模型架构与训练控制 现代AI的核心是深度学习算法,其操控依赖于神经网络的结构设计和训练过程的精细化调控。例如,Transformer架构通过自注意力机制实现对长序列数据的
    的头像 发表于 09-08 17:51 1142次阅读

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

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

    【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 1134次阅读