这里是修真院前端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析前端知识/技能,本篇分享的是:

【 洗牌算法具体指的是什么】

标题:

【修真院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).分享语

今天的小课堂就到这里了,感谢大家的观看,


用户bPbdDlb
422 声望36 粉丝