1.背景介绍
洗牌算法具体指的是什么?
从字面意义上讲,就是实现洗牌的具体方法, 洗牌的目的是什么呢?在不考虑出老千的情况下,洗过的牌要足够乱才好,牌面随机分布,越乱越好! 在科研,计算机科学等很多领域都需要运用到概率分布的随机性, 所以说洗牌算法本质上是把一个给定元素集合打乱成为一个无序元素集合
2.知识剖析
最经典的 FISHER-YATES 的洗牌算法
其算法思想就是 从原始数组中随机抽取一个新的元素到新数组中
1、从还没处理的数组(假如还剩n个)中,产生一个[0, n]之间的随机数 random
2、从剩下的n个元素中把第 random 个元素取出到新数组中
3、删除原数组第random个元素
4、重复第 2 3 步直到所有元素取完
5、最终返回一个新的打乱的数组
let arr = [1,2,3,4,5,6,7,8,9,10]
function shuffle(arr){
let result = [],
random;
while(arr.length>0){
random = Math.floor(Math.random() * arr.length);
result.push(arr[random])
arr.splice(random, 1)
}
return result;
}
KNUTH SHUFFLE
每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等
1、选取数组(长度n)中最后一个元素(arr[length-1]),将其与n个元素中的任意一个交换&#x