此文首发于我的个人博客:从洗牌算法谈起–random.shuffle实现原理 — zhang0peter的个人博客


昨天看知乎的时候看到了洗牌算法(Knuth shuffle, 最初版本叫Fisher–Yates shuffle/ Sattolo’s algorithm):世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例? - 知乎

具体的问题是:如何打乱一个数组,确保数组乱的很随机。

伪代码的实现如下:

-- To shuffle an array a of n elements (indices 0..n-1):
for i from n−1 downto 1 doj ← random integer such that 0 ≤ j ≤ iexchange a[j] and a[i]

在整个过程中,这个算法保证了每一个元素出现在每一个位置的概率是相等的。

洗牌算法时间复杂度为O(N),并且被证明为完美的随机排序。

更具体的说明参考维基:Fisher–Yates shuffle - Wikipedia


然后我就想到了Python的random库中的shuflle函数,shuflle函数的作用就是打乱数组,我觉得具体的实现应该就是这个洗牌算法。

然后去查看random.shuffle的源码:

_inst = Random()
shuffle = _inst.shuffle
    def shuffle(self, x, random=None):"""Shuffle list x in place, and return None.Optional argument random is a 0-argument function returning arandom float in [0.0, 1.0); if it is the default None, thestandard random.random will be used."""if random is None:randbelow = self._randbelowfor i in reversed(range(1, len(x))):# pick an element in x[:i+1] with which to exchange x[i]j = randbelow(i+1)x[i], x[j] = x[j], x[i]else:_int = intfor i in reversed(range(1, len(x))):# pick an element in x[:i+1] with which to exchange x[i]j = _int(random() * (i+1))x[i], x[j] = x[j], x[i]

可以看出使用了洗牌算法。

参考:How Python random shuffle works? - Software Engineering Stack Exchange

从洗牌算法谈起--Python的random.shuffle函数实现原理相关推荐

  1. python——洗牌算法

    原地址:洗牌算法 对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间 ...

  2. 洗牌算法shuffle

    对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一 ...

  3. python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

    对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...

  4. python实现洗牌算法_如何高效而完美地洗牌?用Python做很简单

    Python不用学,看看你就懂:拿来就能用,用用你就会 无需安装编程软件,把代码拷贝到在线编辑器即可运行 考虑一下扑克牌,如何用电脑编程做到高效而完美地洗牌呢? 要求是代码少.效率高,洗牌的结果要同时 ...

  5. 扑克游戏的洗牌算法及简单测试

    2019独角兽企业重金招聘Python工程师标准>>> 我在学习<写给大家看的C语言书>这本书时,对书后面附录的一个扑克游戏程序非常感兴趣.源代码在帖子最后. PS:这本 ...

  6. 随机洗牌算法+matlab,洗牌算法及 random 中 shuffle 方法和 sample 方法浅析

    对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章<扫雷与算 ...

  7. 程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法

    第三十四~三十五章:格子取数,完美洗牌算法 作者:July.caopengcs.绿色夹克衫.致谢:西芹_new,陈利人, Peiyush Jain,白石,zinking. 时间:二零一三年八月二十三日 ...

  8. 洗牌算法(高纳德置乱算法)记录

    原理:将最后一个数和前面n-1个数中的一个数进行交换,然后倒数第二个和前面n-2个数中的一个数进行交换.以此类推 洗牌算法的python实现 import random lst = list(rang ...

  9. 程序员编程艺术第三十四 三十五章 格子取数问题,完美洗牌算法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十四 ...

最新文章

  1. 听说苹果M1能打英伟达RTX?那跑个光追试试
  2. sql语句中的 inner join 、 left join 、 right join、 full join 的区别
  3. unittest框架(三)unittest+yaml数据驱动
  4. 【控制】《最优控制理论与系统》-胡寿松老师-第5章-线性最优状态调节器
  5. JavaScript:window.onload问题
  6. linux系统下的程序开发报告册,linux系统及应用应用开发实验报告册
  7. C# GridView单元格合并.
  8. mysql建表主键_常见的MySQL命令大全second
  9. php共生模式,phpwamp单身狗模式的详解与分析,单身狗模式/即霸体模式的作用讲解。...
  10. 2021北京交通大学《深度学习》平台课—第1讲:绪论
  11. 一维码识别技术与二维码识别技术
  12. Frida 代码提示
  13. 睦星科技Kolmostar获1000万美元 A 轮融资,将推出更多元的GNSS定位解决方案
  14. pytohn 操作excel表格常用模块 xlwt xlsxwriter
  15. Windows bat 脚本命令基础
  16. ORA-00119和ORA-00132的解决方案
  17. 【Linux】Linux 指令练习题 (一)
  18. 基于Zotero和坚果云的大规模文献同步管理环境配置及常用功能介绍(超详细)
  19. NOIP 2013 普及组初赛试题
  20. ORA-00371: not enough shared pool memory, should be atleast 62198988 bytes

热门文章

  1. DSML:深度子空间相互学习模型(用于癌症亚型预测)
  2. 在markdown里面插入特殊的符号
  3. 服务器又中毒了,得治一治!
  4. 微生物组科学蓬勃发展,5大方向备受行业关注!
  5. GEB:中科院南土所梁玉婷组-大陆尺度下稻田土壤微生物β多样性的纬度分布特征...
  6. 宏基因组序列物种分类之kraken 1/2和Bracken的使用
  7. NBT:超高速细菌基因组检索技术
  8. 从实验室走向大众,一文读懂Nanopore测序技术的发展及应用
  9. 脂肪肝,应该拿你怎么办
  10. pandas使用datetime创建示例dataframe:包含完整的时分秒信息、创建时间索引、使用不同的时间频率、date_range中参数freq的偏移量别名