这里是修真院前端小课堂,每篇分享文从
【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】
八个方面深度解析前端知识/技能,本篇分享的是:
【洗牌算法具体指的是什么】
标题:
【修真院web小课堂】洗牌算法具体指的是什么
开场语:
大家好,我是IT修真院北京分院第36期的学员张新,一枚正直纯洁善良的web程序员,今天给大家分享一下,修真院官网js(职业)任务2,深度思考中的知识点——洗牌算法具体指的是什么
(1)背景介绍:
洗牌算法顾名思义就是,它的产生就是用来解决洗牌场合的问题,目的是产生一系列等概率的随机数,使得很难去预测牌的顺序,洗牌算法是我们常见的随即问题,同时也是一道经典的面试题。
(2)知识剖析:
何为洗牌算法:一个1到n的序列随机打乱,保证每一个数出现大的概率相同。
(3)常见问题:
有哪些实现洗牌的算法?
(4)解决方案:
假如你要洗牌,那么最随机的做法无疑是从牌堆里随便抽一张出来,然后放在一边,之后从剩下的牌里重复之前的操作,直到所有牌都被抽出来放到了另一堆中。抽象到代码世界,按相同的做法,就是随机从数组里取出一个元素,保存到另一个数组,然后重复之,直到原数组中所有元素都处理掉。
(5)编码实战:
function shuffle(array) {
var copy = [], n = array.length, i;
// 如果还有剩余元素则继续
while (n) {
// 随机取一个元素
i = Math.floor(Math.random() * array.length);
// 如果这个元素之前没有被选中过
if (i in array) {
copy.push(array[i]);
delete array[i];
n--;
}
}
return copy;
}
(6)拓展思考:
除了洗牌算法还有哪些经典的算法。
冒泡排序,快速排序,插入排序,二分查找,选择排序,希尔排序,归并排序,堆排序,基数排序。
(7)参考文献:
由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle
(8)更多讨论:
Q1:提问人:1.什么是好的洗牌算法?
A1:回答人(张新): 洗牌之后,如果能够保证每一个数出现在所有位置上的概率是相等的,那么这种算法是符合要求的;这在个前提下,尽量降低时间和空间复杂度。
Q2:提问人:2,洗牌中抽牌法指的是什么?
A2:回答人(张新):
//每次抽出一张牌,放在另一堆。把最后一张未抽的牌放在空位子上。
function shuffle_pick_1(m) //洗牌 //抽牌法
{
//生成m张牌
var arr = new Array(m);
for (var i=0; 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;
}
Q3:提问人:洗牌中换牌发指的是什么?
A3:回答人(张新):
//第i张与任意一张牌换位子,换完一轮即可。
function shuffle_swap(m) //洗牌 //换牌法
{
//生成m张牌
var arr = new Array(m);
for (var i=0; i
arr[i] = i;
}
//第i张与任意一张牌换位子,换完一轮即可
for (var i=0; i
var rnd = Math.floor(Math.random()*(i+1)),
temp = arr[rnd];
arr[rnd] = arr[i];
arr[i]=temp;
}
return arr;
}
(9)鸣谢:
感谢刘仁瑞、郭晨阳师兄,此教程是在他们之前技术分享的基础上完善而成。
(10)结束语:
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。