【js-task2】洗牌算法具体指的是什么
分享人:王刚
目录
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
什么是洗牌算法
洗牌算法是常见的随机问题;它可以抽象成:得到一个M以内的所有自然数的随机顺序数组。
常见问题描述:
1.将自然数1 ~ 100随机插入到一个大小为100的数组,无重复元素
2. 1 ~ 52张扑克牌重新洗牌
最经典的 Fisher-Yates 的洗牌算法
其算法思想就是 从原始数组中随机抽取一个新的元素到新数组中
1、从还没处理的数组(假如还剩n个)中,产生一个[0, n]之间的随机数 random
2、从剩下的n个元素中把第 random 个元素取出到新数组中
3、删除原数组第random个元素
4、重复第 2 3 步直到所有元素取完
5、最终返回一个新的打乱的数组
Knuth Shuffle
每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等
1、选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
2、选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
3、重复第 1 2 步,直到剩下1个元素为止
其他方法
Array.sort()
利用Array的sort方法可以更简洁的实现打乱,对于数量小的数组来说足够。因为随着数组元素增加,随机性会变差。
[1,2,3,4,5,6].sort(function(){
return .5 - Math.random();
})
function shuffle(arr){
let n = arr.length, random;
while(0!=n){
random = (Math.random() * n--) >>> 0; // 无符号右移位运算符向下取整
[arr[n], arr[random]] = [arr[random], arr[n]] // ES6的结构赋值实现变量互换
}
return arr;
}
怎么保证这个算法得到的数组是完全随机的(即等概)?
6.扩展思考
使用sort函数的随机是真的随机么?
1.JavaScript高级程序设计
2.head first JavaScript
语法: return[()[expression][]]; 可选项 expression 参数是要从函数返回的值。如果省略,则该函数不返回值。 用 return 语句来终止一个函数的执行,并返回 expression 的值。如果 expression
被省略, 或在函数内没有 return 语句被执行,则把值 undefined 赋给调用当前函数的表达式。