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

    文章

    4451

    浏览量

    90742
  • 代码
    +关注

    关注

    30

    文章

    4554

    浏览量

    66726
  • Shuffle
    +关注

    关注

    0

    文章

    5

    浏览量

    1647

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

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

收藏 人收藏

    评论

    相关推荐

    浅析配电能源管理系统在钢铁行业的应用

    电子发烧友网站提供《浅析配电能源管理系统在钢铁行业的应用.docx》资料免费下载
    发表于 01-11 16:15 0次下载

    保护器件过电应力失效机理和失效现象浅析

    保护器件过电应力失效机理和失效现象浅析
    的头像 发表于 12-14 17:06 328次阅读
    保护器件过电应力失效机理和失效现象<b class='flag-5'>浅析</b>

    陶瓷电容温度系数浅析:1类和2类电容有何差异?如何标识?

    陶瓷电容温度系数浅析:1类和2类电容有何差异?如何标识?
    的头像 发表于 12-08 17:30 568次阅读
    陶瓷电容温度系数<b class='flag-5'>浅析</b>:1类和2类电容有何差异?如何标识?

    电子电路板中的稳态与瞬态热传递浅析

    电子电路板中的稳态与瞬态热传递浅析
    的头像 发表于 12-05 17:20 464次阅读
    电子电路板中的稳态与瞬态热传递<b class='flag-5'>浅析</b>

    五种宽带接入主要技术浅析

    电子发烧友网站提供《五种宽带接入主要技术浅析.pdf》资料免费下载
    发表于 11-10 14:48 0次下载
    五种宽带接入主要技术<b class='flag-5'>浅析</b>

    浅析板框压滤机类型构造和工作原理

    电子发烧友网站提供《浅析板框压滤机类型构造和工作原理.doc》资料免费下载
    发表于 11-03 10:37 0次下载
    <b class='flag-5'>浅析</b>板框压滤机类型构造和工作原理

    太阳能电池晶体硅光伏组件封装浅析(工艺控制篇)

    电子发烧友网站提供《太阳能电池晶体硅光伏组件封装浅析(工艺控制篇).doc》资料免费下载
    发表于 11-03 10:21 3次下载
    太阳能电池晶体硅光伏组件封装<b class='flag-5'>浅析</b>(工艺控制篇)

    智能照明控制设计原则浅析

    电子发烧友网站提供《智能照明控制设计原则浅析.doc》资料免费下载
    发表于 11-03 09:40 0次下载
    智能照明控制设计原则<b class='flag-5'>浅析</b>

    工程机械液压系统节能技术浅析

    电子发烧友网站提供《工程机械液压系统节能技术浅析.pdf》资料免费下载
    发表于 11-03 09:37 0次下载
    工程机械液压系统节能技术<b class='flag-5'>浅析</b>

    浅析各种类型的光伏支架

    电子发烧友网站提供《浅析各种类型的光伏支架.doc》资料免费下载
    发表于 11-02 11:37 1次下载
    <b class='flag-5'>浅析</b>各种类型的光伏支架

    浅析智能家居照明系统工作原理及应用

    电子发烧友网站提供《浅析智能家居照明系统工作原理及应用.pdf》资料免费下载
    发表于 11-02 11:23 0次下载
    <b class='flag-5'>浅析</b>智能家居照明系统工作原理及应用

    STM32 LL库为什么比HAL库高效呢?

    有些应用要求MCU能高效处理,特别是跑一些算法时,对CPU执行效率要求较高。
    的头像 发表于 10-26 16:42 391次阅读
    STM32 LL库为什么比HAL库<b class='flag-5'>高效</b>呢?

    如何高效管理MCU内存? 多种分配算法对比?

    如何高效管理MCU内存? 多种分配算法对比?
    的头像 发表于 10-17 18:21 685次阅读
    如何<b class='flag-5'>高效</b>管理MCU内存? 多种分配<b class='flag-5'>算法</b>对比?

    C语言如何写出高效代码呢?

    当涉及复杂的高效C代码案例时,这些代码示例展示了C语言中一些复杂且高效的应用案例,涵盖了排序算法、图算法、位操作、文件操作、多线程编程等领域。
    发表于 09-06 14:57 190次阅读
    C语言如何写出<b class='flag-5'>高效</b>代码呢?

    浅析pid算法的设计与实现过程

    负反馈系统,都有滞后效应,但为什么运放、电源这类的却从来不提PID算法呢?这是因为这类系统的滞后延时时间非常短,若考虑这个延时,负反馈引入180度相位,延时恰好引入180度相位,则完全可能引起振荡。
    发表于 07-31 14:21 396次阅读
    <b class='flag-5'>浅析</b>pid<b class='flag-5'>算法</b>的设计与实现过程