从洗牌算法谈起--Python的random.shuffle函数实现原理
此文首发于我的个人博客:从洗牌算法谈起–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函数实现原理相关推荐
- python——洗牌算法
原地址:洗牌算法 对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间 ...
- 洗牌算法shuffle
对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一 ...
- python实现洗牌算法_洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章 <扫雷与 ...
- python实现洗牌算法_如何高效而完美地洗牌?用Python做很简单
Python不用学,看看你就懂:拿来就能用,用用你就会 无需安装编程软件,把代码拷贝到在线编辑器即可运行 考虑一下扑克牌,如何用电脑编程做到高效而完美地洗牌呢? 要求是代码少.效率高,洗牌的结果要同时 ...
- 扑克游戏的洗牌算法及简单测试
2019独角兽企业重金招聘Python工程师标准>>> 我在学习<写给大家看的C语言书>这本书时,对书后面附录的一个扑克游戏程序非常感兴趣.源代码在帖子最后. PS:这本 ...
- 随机洗牌算法+matlab,洗牌算法及 random 中 shuffle 方法和 sample 方法浅析
对于算法书买了一本又一本却没一本读完超过 10%,Leetcode 刷题从来没坚持超过 3 天的我来说,算法能力真的是渣渣.但是,今天决定写一篇跟算法有关的文章.起因是读了吴师兄的文章<扫雷与算 ...
- 程序员编程艺术第三十四~三十五章:格子取数问题,完美洗牌算法
第三十四~三十五章:格子取数,完美洗牌算法 作者:July.caopengcs.绿色夹克衫.致谢:西芹_new,陈利人, Peiyush Jain,白石,zinking. 时间:二零一三年八月二十三日 ...
- 洗牌算法(高纳德置乱算法)记录
原理:将最后一个数和前面n-1个数中的一个数进行交换,然后倒数第二个和前面n-2个数中的一个数进行交换.以此类推 洗牌算法的python实现 import random lst = list(rang ...
- 程序员编程艺术第三十四 三十五章 格子取数问题,完美洗牌算法
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 第三十四 ...
最新文章
- 听说苹果M1能打英伟达RTX?那跑个光追试试
- sql语句中的 inner join 、 left join 、 right join、 full join 的区别
- unittest框架(三)unittest+yaml数据驱动
- 【控制】《最优控制理论与系统》-胡寿松老师-第5章-线性最优状态调节器
- JavaScript:window.onload问题
- linux系统下的程序开发报告册,linux系统及应用应用开发实验报告册
- C# GridView单元格合并.
- mysql建表主键_常见的MySQL命令大全second
- php共生模式,phpwamp单身狗模式的详解与分析,单身狗模式/即霸体模式的作用讲解。...
- 2021北京交通大学《深度学习》平台课—第1讲:绪论
- 一维码识别技术与二维码识别技术
- Frida 代码提示
- 睦星科技Kolmostar获1000万美元 A 轮融资,将推出更多元的GNSS定位解决方案
- pytohn 操作excel表格常用模块 xlwt xlsxwriter
- Windows bat 脚本命令基础
- ORA-00119和ORA-00132的解决方案
- 【Linux】Linux 指令练习题 (一)
- 基于Zotero和坚果云的大规模文献同步管理环境配置及常用功能介绍(超详细)
- NOIP 2013 普及组初赛试题
- ORA-00371: not enough shared pool memory, should be atleast 62198988 bytes
热门文章
- DSML:深度子空间相互学习模型(用于癌症亚型预测)
- 在markdown里面插入特殊的符号
- 服务器又中毒了,得治一治!
- 微生物组科学蓬勃发展,5大方向备受行业关注!
- GEB:中科院南土所梁玉婷组-大陆尺度下稻田土壤微生物β多样性的纬度分布特征...
- 宏基因组序列物种分类之kraken 1/2和Bracken的使用
- NBT:超高速细菌基因组检索技术
- 从实验室走向大众,一文读懂Nanopore测序技术的发展及应用
- 脂肪肝,应该拿你怎么办
- pandas使用datetime创建示例dataframe:包含完整的时分秒信息、创建时间索引、使用不同的时间频率、date_range中参数freq的偏移量别名