小课堂【萌新】

洗牌算法具体指的是什么?

分享人:汪胜

目录

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常会碰到,本质是让一个数组内的元素随机排列。

2.知识剖析

洗牌算法是一种随机排序的算法,其排序思想是:首先生成一个有序的数组,然后从数组中随机抽取两个元素交换位置,重复这个过程若干次,就变成了一个随机的数组。

如何实现一个简单的洗牌算法?

                
    var oneArray = [1,2,3,4,5,6,7,8];
    console.log(oneArray);
    Array.prototype.shuffle = function () {
        var a = oneArray;
        for(var i = a.length - 1;i >= 0; i--){
            var randomIndex = Math.floor(Math.random()*(i + 1));
            var itemAtIndex = a[randomIndex];
            a[randomIndex] = a[i];
            a[i] = itemAtIndex;
        }
        return a;
    };
    console.log(oneArray.shuffle());
                   
                

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

有复杂的洗牌算法吗?
演示一

主要代码

                
                   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;
        }
                
            
演示二

主要代码

                    
                        function shuffle(array) {
                        var copy = [],
                        n = array.length,
                        i;
                        while (n) {
                        i = Math.floor(Math.random() * n--);
                        copy.push(array.splice(i, 1)[0]);
                        }
                         return copy;
                        }
                    
            
演示三

主要代码

                    
                        function shuffle(array) {
                        var m = array.length,
                        t, i;
                         while (m) {
                        i = Math.floor(Math.random() * m--);
                        t = array[m];
                        array[m] = array[i];
                        array[i] = t;
                        }
                        return array;
                        }
                    
                

7.参考文献

一、javascript随机之洗牌算法深入分析

二、【算法详解】洗牌算法

三、数组的完全随机排列

四、由乱序播放说开了去-数组的打乱算法

8.更多讨论

鸣谢

感谢大家观看

By 汪胜