Fisher–Yates shuffle 洗牌(shuffle)算法
今天在敲undersore的源码,数组里面有一个shuffle,把数组随机打乱。
_.shuffle = function(obj) { var set = isArrayLike(obj) ? obj : _.values(obj); var length = set.length; var shuffled = Array(length); for (var index = 0, rand; index < length; index++) { rand = _.random(0, index); if (rand !== index) shuffled[index] = shuffled[rand]; shuffled[rand] = set[index]; } return shuffled; };
源码如上,php,前端出身,也不是科班计算机生出身,对算法还不是太熟,只是零星看过一写。
简单分析一下,例如:[0,1,2,3,4,5,6]的数组
1、产生一个新的数组
2、循环数组的长度,利用随机数来打乱数组
在第一次循环中index=0,第二次index=1 随机数返回的也是0 和1 所开始的两次 新数组还是[0,1],不会变化
在第三次循环之后就会出现 不同与index 的随机,比如rand = 1;rand 不同于index 就会把新数组第1位置的值1 赋值给新组数的第2位
shuffled[index] = shuffled[rand];
新数组就成了[0,1,1]
然后
shuffled[rand] = set[index]
把原数组的第2位2赋值给新组数的第1位
[0,2,1]
就可以产生随机的打乱的数组,但是你传两位的数组,就不会被打乱