今天给大家分享一下:洗牌算法具体指的是什么。
一、背景介绍
洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常会碰到,本质是让一个数组内的元素随机排列。类似于洗牌,将所有牌的位置打乱,让他们随机出现在任何位置。
二、知识剖析
洗牌算法的原理是什么?
方法一:
从牌堆里随便抽一张出来,然后放在一边,之后从剩下的牌里重复之前的操作,直到所有牌都被抽出来放到了另一堆中。抽象到代码世界,按相同的做法,就是随机从数组里取出一个元素,保存到另一个数组,然后重复之,直到原数组中所有元素都处理掉。
demo1 shuffle 方法代码我们创建了一个copy数组,然后遍历目标数组,将其元素复制到copy数组里,同时将该元素从目标数组中删除,这样下次遍历的时候就可以跳过这个序号。
方法二:
随机从数组中抽出一个元素,然后与最后个元素交换,相当于把这个随机抽取的元素放到了数组最后面去,表示它已经是被随机过了,同时被换走的那个元素跑到前面去了,会在后续的重复操作中被随机掉。一轮操作过后,下一轮我们只在剩下的n-1个元素也就是数组的前n-1个元素中进行相同的操作,直到进行到第一个。
demo2 shuffle代码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 各种洗牌算法的效率比较:比较代码执行链接
鸣谢
感谢观看
BY聂义中
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论