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

    文章

    4595

    浏览量

    92562
  • 代码
    +关注

    关注

    30

    文章

    4733

    浏览量

    68286
  • Shuffle
    +关注

    关注

    0

    文章

    5

    浏览量

    1674

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

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

收藏 人收藏

    评论

    相关推荐

    技术科普 | 芯片设计中的LEF文件浅析

    技术科普 | 芯片设计中的LEF文件浅析
    的头像 发表于 11-13 01:03 69次阅读
    技术科普 | 芯片设计中的LEF文件<b class='flag-5'>浅析</b>

    华纳云:Chord算法如何管理节点间的联系?

    ,以确保网络变化时后继关系的正确性。 查找效率: Chord算法通过finger表和后继指针的设计,使得查找操作的平均时间复杂度为O(log n),其中n是网络中的节点数量。 通过这些机制,Chord算法能够有效地管理节点间的联系,并在分布式环境中提供
    发表于 11-08 16:03

    U盘存储并联,算法交互输出

    FreeRTOS),负责任务调度和资源管理。 使用C/C++语言编写数据管理、算法和通信模块,确保代码的高效性和可靠性。 利用现有的库和框架(如TensorFlow Lite Micro)来实现轻量级的机器
    发表于 10-28 07:36

    QC快充芯片,因高效而兼容性好而成为手机标配的充电解决方案!

    ,其核心在于一套高效的充电协议,该协议通过智能调整充电过程中的电压和电流,实现了远超传统充电方式的速度。 QC快充芯片内置了精密的电路设计和先进的算法,能够实时监测电池状态,动态调整充电策略,确保既
    发表于 09-26 10:03

    无人机电力巡检系统的功能浅析

           无人机电力巡检系统的功能浅析        随着电力行业的快速发展,电力输电网络的规模不断扩大,如何高效、精准地巡检电力设施,确保供电的稳定性和安全性,成为电力企业面临的重要挑战。传统
    的头像 发表于 08-14 16:48 302次阅读
    无人机电力巡检系统的功能<b class='flag-5'>浅析</b>

    充电也要算法?储能充电芯片中的算法处理器

    或充电设备中,负责实时监控电池状态,执行充电策略,并调整充电参数,如电流和电压。   比如算法处理器可以执行复杂的充电算法,如恒流/恒压充电、脉冲充电、智能协商充电等,这些算法能够根据电池的状态调整充电参数,实现更
    的头像 发表于 07-30 00:07 3568次阅读

    BLDC电机控制算法详解

    无刷直流电机(Brushless DC Motor,简称BLDC电机)以其高效率、高可靠性和低噪音等特点,在工业、家电和汽车等领域得到了广泛应用。为了实现BLDC电机的精确控制,需要采用适当的控制
    的头像 发表于 06-14 10:49 849次阅读

    常用的电机控制算法有哪些

    在电机控制领域,选择合适的控制算法对于实现高效、精确且稳定的电机运行至关重要。以下将详细介绍几种常用的电机控制算法,并通过具体的分析和实例,探讨它们的特点、应用以及优势。
    的头像 发表于 06-05 16:31 2028次阅读

    浅析FreeRTOS任务调度器的三种调度算法和应用

    FreeRTOS在MCU领域应用非常广泛,今天就给大家讲解一下FreeRTOS调度器中的三种调度算法,以及在瑞萨RZ/T2L MPU中的应用。
    的头像 发表于 05-10 14:02 6824次阅读
    <b class='flag-5'>浅析</b>FreeRTOS任务调度器的三种调度<b class='flag-5'>算法</b>和应用

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

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

    浮点LMS算法的FPGA实现

    运算的运算步骤远比定点运算繁琐,运算速度慢且所需硬件资源大大增加,因此基于浮点运算的LMS算法的硬件实现一直以来是学者们研究的难点和热点。 本文正是基于这种高效结构的多输入FPA,在FPGA上成功实现了基于浮点运算的LMS算法
    的头像 发表于 12-21 16:40 711次阅读

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

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

    浅析工业低功耗红外气体浓度传感器和常规钨丝灯气体浓度传感器的工作原理及其区别

    浅析工业低功耗红外气体浓度传感器和常规钨丝灯气体浓度传感器的工作原理及其区别
    的头像 发表于 12-13 10:53 658次阅读
    <b class='flag-5'>浅析</b>工业低功耗红外气体浓度传感器和常规钨丝灯气体浓度传感器的工作原理及其区别

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

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

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

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