美文网首页
【算法】随机洗牌算法-随机数组重组问题

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

作者: acsamson | 来源:发表于2019-04-23 01:08 被阅读0次

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

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

算法怎么实现?

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]];

相关文章

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

    随机洗牌可以看成随机数组重组问题, 什么意思呢 假如我要把一副牌随机打乱重组这一副牌可以怎么做? 随机洗牌是从原数...

  • 抢红包算法@随机算法

    生成随机数 注:randomElement() 如果 range 是空,返回 nil 数组随机 洗牌算法 Swif...

  • JS中随机排列数组顺序(经典洗牌算法)和数组的排序方法

    经典洗牌算法 洗牌算法是一个经典的算法,其核心就是让一个数组的值随机排列,重点在于“随机”和“程序效率”。网上一直...

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

    今天给大家分享一下:洗牌算法具体指的是什么。 一、背景介绍 洗牌算法是我们常见的随机问题,在玩游戏、随机排序时经常...

  • Golang洗牌算法,抢红包算法

    本文为转载,原文:Golang洗牌算法,抢红包算法 1. 洗牌算法 洗牌算法,即将原来的顺序打乱,组成新的随机排序...

  • 洗牌算法

    音乐软件中的随机播放算法是怎样实现的? 洗牌算法(Shuffle) 生成一个随机数(Random) 这里给出洗牌算...

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

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

  • 洗牌算法:数组随机排序

    最近做音乐播放器,基本功能已实现,准备再写一个循环播放功能,其中涉及列表循环、单曲循环、随机循环。实现这几个功能本...

  • 随机洗牌算法

    洗牌可以抽象为:给定一组排列,输出该排列的一个随机组合 reference洗牌算法汇总以及测试洗牌程序的正确性完美...

  • 随机扫雷面,去重[...new Set(arr)]

    利用随机洗牌在10*10表格内输出随机20个O 来自 Knuth洗牌算法 ,Knuth的书《The Art of ...

网友评论

      本文标题:【算法】随机洗牌算法-随机数组重组问题

      本文链接:https://www.haomeiwen.com/subject/eczpgqtx.html