洗牌算法具体指的是什么

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/84701495

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

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

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

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

标题:

【修真院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)参考文献:

<a href="http://www.cnblogs.com/Wayou/p/fisher_yates_shuffle.html" target="_blank">由乱序播放说开了去-数组的打乱算法Fisher–Yates Shuffle</a>

<a href="https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.09.md" target="_blank">UC面试题-完美洗牌算法</a>

(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&gt;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)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/84701495