发表于: 2021-03-15 19:48:19

1 2018


今天完成的事情:完成了任务二

明天计划的事情:修改代码提交

收获:洗牌算法到底指什么?

洗牌算法,字面意思理解,即把数据像洗牌一样打乱。

假如要洗牌,那么最随机的做法无疑是从牌堆里随便抽一张出来,然后放在一边,之后从剩下的牌里重复之前的操作,直到所有牌都被抽出来放到了另一堆中。抽象到代码世界,按相同的做法,就是随机从数组里取出一个元素,保存到另一个数组,然后重复之,直到原数组中所有元素都处理掉。

var a = [0123456789];                               //创建一个数组a

var b = [];                                                            //创建一个空数组b

for (var i = 0i < a.lengthi++) {
            var index = Math.floor(Math.random() * (a.length - i));     //创建一个随机数,第一轮在0~10之间,第二轮在0~9之间。假设为2

            b.push(a[index]);                                         //将a的第3个数值添加到b里

            var center = a[index];                                   //定义变量center储存a的第三个值

            a[index= a[a.length - i - 1];                           //将a的第三个值等于最后一个值

            a[a.length - i - 1= center;                               //将最后一个指等于储存的a的第三个值,相当于两个数值换了位置

};                                                                      //因为下一轮不会选中到它,所以相当于从a数组里删除,再向b添加数值

还可以利用sort()方法

function shuffle(a) {
            return a.concat().sort(function (a, b) {
                return Math.random() - 0.5;
      });
}

但这种方法不是真正的随机,越靠近中间的数出现的概率越高。


Fisher–Yates Shuffle

function shuffle(array) {
            var _array = array.concat();

            for (var i = _array.length; i--;) {
                var j = Math.floor(Math.random() * (i + 1));
                var temp = _array[i];
                _array[i= _array[j];
                _array[j= temp;
            }

            return _array;
}

Fisher–Yates Shuffle的思想非常的简单,遍历数组元素,将其与之前的任意元素交换。


返回列表 返回列表
评论

    分享到