发表于: 2017-10-25 22:24:15
2 691
大家好,我是IT修真院深圳分院第10期学员聂义中,一枚正直善良的web程序员。
今天给大家分享一下:洗牌算法具体指的是什么。
一、背景介绍
洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常会碰到,本质是让一个数组内的元素随机排列。类似于洗牌,将所有牌的位置打乱,让他们随机出现在任何位置。
二、知识剖析
洗牌算法的原理是什么?
方法一:
从牌堆里随便抽一张出来,然后放在一边,之后从剩下的牌里重复之前的操作,直到所有牌都被抽出来放到了另一堆中。抽象到代码世界,按相同的做法,就是随机从数组里取出一个元素,保存到另一个数组,然后重复之,直到原数组中所有元素都处理掉。

我们创建了一个copy数组,然后遍历目标数组,将其元素复制到copy数组里,同时将该元素从目标数组中删除,这样下次遍历的时候就可以跳过这个序号。
方法二:
随机从数组中抽出一个元素,然后与最后个元素交换,相当于把这个随机抽取的元素放到了数组最后面去,表示它已经是被随机过了,同时被换走的那个元素跑到前面去了,会在后续的重复操作中被随机掉。一轮操作过后,下一轮我们只在剩下的n-1个元素也就是数组的前n-1个元素中进行相同的操作,直到进行到第一个。

shuffle函数挂载在Array对象的原型之下,便于数组直接调用该函数。在shuffle函数内部,this引用的就是调用该shuffle的数组。用一个新的变量引用this,也就是调用shuffle函数的数组。接下来的for循环用于遍历所有数组内的所有元素,并进行随机交换。注意,遍历顺序是从后往前进行的,也就是说从input.length-1位置的元素开始,知道遍历到数组中的第一个元素。遍历过程中的位置由变量i指定。接下来,使用了两行代码在指定范围内挑选一个随机元素。 变量randomIndex存储了一个随机数,该随机数可以用作数组的索引,进而提取一个随机元素。注意,该随机数的最大值并不是数组的长度,而是变量i的值。确定了随机元素的索引之后,用新的变量保存该元素的值,然后交换选中元素和随机元素的值。
三、常见问题
洗牌算法是否真的实现了完全随机?
四、解决方案

五、编码实战
六、拓展思考
1 、还有什么比较实用的乱序方法?
利用sort函数 : arr.sort(function(){ return 0.5-Math.random()});
一行代码就可以实现,相对而言比较简单,但是他并不能实现真正意义的随机。
参考一:www.w3cplus.com/javascript/shuffling-array-js.html
参考二:http://www.cnblogs.com/Wayou/p/fisher_yates_shuffle.html
参考三:http://blog.jobbole.com/64897/
参考四:http://www.cnblogs.com/jkisjk/archive/2012/04/23/javascript_shuffle.html
八、更多讨论
1 各种洗牌算法的效率比较:比较代码执行链接
视频:
PPT : PPT
鸣谢
感谢观看
BY聂义中
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
------------------------------------------------------------------------------------------------------------------------
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧 !
请点击链接
作者:聂义中
链接:http://www.jnshu.com/login/1/15086131
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论