【算法】随机洗牌算法-随机数组重组问题

随机洗牌可以看成随机数组重组问题, 什么意思呢

假如我要把一副牌随机打乱重组这一副牌可以怎么做? 随机洗牌是从原数组中随机抽取一张牌放在一边, 然后再从原数组中再选一张放到刚刚取出来的牌堆中, 重复这个行为, 直到原数组被取完为止

算法怎么实现?

function shuffle(array) {
    var arr = [];
    var len = array.length;
    var i;
    while (len) {
        i = Math.floor(Math.random() * len);
        if (i in array) {
            arr.push(array[i]);
            delete array[i];
            len--;
        }
    }
    return arr;
}

注意因为产生的随机数有可能经常是同一个值, 那么就有可能很大程度上造成效率问题, 甚至极端地说, 产生的随机数一直是同一个值, 那么程序就永远执行不完, 那就考虑用splice()把该元素删除掉

并且如果用splice()来删除元素也会造成效率问题, 他会把后面的数组补充到前面去, 也就是常说的移动, 那么删除一个移动一个就会很耗时间,

那么怎么高效率洗牌?

可以把每次选到的随机数字和数组末尾进行交换

i = Math.floor(Math.random() * len--); 
[array[len], array[i]] = [array[i], array[len]];
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大家好,我是IT修真院武汉分院第11期的学员,一枚正直纯洁善良的前端程序员,今天给大家分享一下,修真院官网js任务...
    斌仔_83e7阅读 2,700评论 0 2
  • 1.背景介绍 洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常会碰到,本质是让一个数组内的元素随机排列。 类...
    苟况劝学阅读 1,217评论 0 0
  • 一、问答 数组方法里push、pop、shift、unshift、join、split分别是什么作用。(*) 栈方...
    婷楼沐熙阅读 858评论 4 1
  • 转载:在开发中,数组的使用场景非常多,平日中也涉及到很多数组的api/相关操作,一直也没有对这块内容进行一块整理总...
    七色烟火阅读 3,239评论 0 3
  • “其实,你是北朝人。” 听到了然道人悠悠地从挤满馄饨的嘴里飘出这么一句话,曲觞,柳之羲,许静姝三人同时停下了手里的...
    小小闷骚阅读 783评论 3 7