网站模块化项目第一期终于在加班75天后完成了。
接下去要多看书还要多看娃
项目需求数组随机排序
洗牌算法
数组随机排序其基本原理是洗牌算法(Fisher–Yates shuffle):
是一种将有限集合的顺序打乱的一种算法
首先是一种常见的错误随机排序
为什么是错误的排序我也是看了一篇文字
链接:https://gold.xitu.io/entry/573164cc1ea4930064f70b01
比较常见的用法 递归的方法来处理
underscore.js 中的 shuffle 方法
原理
定义一个数组(shuffled),长度(length)是原数组(arr)长度
取 0 到 index (初始0) 随机值 rand, shuffled[index] = shuffled[rand],
shuffled[rand] = arr[index]
index++ ; 重复第二步,
直到 index = length -1
就是 shuffled 从 0 到 length-1 的赋值过程,并且新加入的值是 arr[index],shuffled[index] 的值是已赋值的元素中随机值shuffled[rand],因为这样会有两个重复的值,所以 shuffled[rand] 就等于新加入的值 arr[index]
第三种 使用临时变量保存
Knuth-Durstenfeld Shuffle
Fisher-Yates 洗牌算法的一个变种是 Knuth Shuffle
每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度从 Fisher 算法的 O(n2)提升到了 O(n)
- 选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换,此时最后一个元素已经确定
- 选取倒数第二个元素(arr[length-2]),将其与n-1个元素中的任意一个交换
- 重复第 1 2 步,直到剩下1个元素为止
function shuffle(arr){ var length = arr.length, temp, random; while(0 != length){ random = Math.floor(Math.random() * length) length--; // swap temp = arr[length]; arr[length] = arr[random]; arr[random] = temp; } return arr; }