这里是修真院前端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析前端知识/技能,本篇分享的是:
【 洗牌算法具体指的是什么】
标题:
【修真院web小课堂】洗牌算法具体指的是什么
开场语:
大家好,我是IT修真院上海分院第11期的学员陈杰,一枚正直纯洁善良的web程序员,今天给大家分享一下,修真院官网js(职业)任务2,深度思考中的知识点——洗牌算法具体指的是什么
(1)背景介绍:
洗牌算法顾名思义就是,它的产生就是用来解决洗牌场合的问题,目的是产生一系列等概率的随机数,使得很难去预测牌的顺序,洗牌算法是我们常见的随即问题,同时也是一道经典的面试题。
(2)知识剖析:
何为洗牌算法:一个1到n的序列随机打乱,保证每一个数出现大的概率相同。
(3)常见问题:
有哪些实现洗牌的算法?
(4)解决方案:
假如你要洗牌,那么最随机的做法无疑是从牌堆里随便抽一张出来,然后放在一边,之后从剩下的牌里重复之前的操作,直到所有牌都被抽出来放到了另一堆中。抽象到代码世界,按相同的做法,就是随机从数组里取出一个元素,保存到另一个数组,然后重复之,直到原数组中所有元素都处理掉。
(5)编码实战:
function shuffle_pick_1(m) //洗牌 //抽牌法
{
//生成m张牌
var arr = new Array(m);
for (var i=0; i<m; i++) {
arr[i] = i;
}
//每次抽出一张牌,放在另一堆。因为要在数组里抽出元素,把后面的所有元素向前拉一位,所以很耗时。
var arr2 = new Array();
for (var i=m; i>0; i--) {
var rnd = Math.floor(Math.random()*i);
arr2.push(arr[rnd]);
arr.splice(rnd,1);
}
return arr2;
}
console.time();
shuffle_pick_1(100);
// console.log(shuffle_pick_1(10)) ;
console.timeEnd();
function shuffle_swap(m) //洗牌 //换牌法
{
//生成m张牌
var arr = new Array(m);
for (var i=0; i<m; i++) {
arr[i] = i;
}
//第i张与任意一张牌换位子,换完一轮即可
for (var i=0; i<m; i++) {
var rnd = Math.floor(Math.random()*(i+1)),
temp = arr[rnd];
arr[rnd] = arr[i];
arr[i]=temp;
}
console.log;
}
console.time();
shuffle_pick_1(100);
// console.log(shuffle_pick_1(10))
console.timeEnd();
function shuffle_insert(m) //洗牌 //插牌法优化版,可以用数学归纳法证明,这种洗牌是均匀的。
{
//每次生成一张最大的牌,与随机的某张牌换位子
var arr = new Array(m);
arr[0] = 0;
for (var i=1; i<m; i++) {
var rnd = Math.floor(Math.random()*(i+1));
arr[i] = arr[rnd];
arr[rnd] = i;
}
return arr;
}
console.time();
shuffle_insert(100)
/ console.log(shuffle_insert(10)) /
console.timeEnd();
(6)拓展思考:
除了洗牌算法还有哪些经典的算法。
冒泡排序,快速排序,插入排序,二分查找,选择排序,希尔排序,归并排序,堆排序,基数排序。
(7)参考文献:
<a href="https://segmentfault.com/q/1010000010807637">由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle
(8)更多讨论:
Q1:你之前提到的通过时间比较,怎么实现
A1:后来增加了这么一段来进行时间上的比较
console.time();
shuffle_insert(100)
/ console.log(shuffle_insert(10)) /
console.timeEnd();
Q2:洗牌算法有什么应用
A2: 这个比较多,大部分随机都有洗牌算法的身影,比如随机播放,随机数列等
Q3:一个好的算法有什么特性
A3:我认为是在简洁明了的情况下实现概率的相等
(9).分享语
今天的小课堂就到这里了,感谢大家的观看,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。