千家信息网

JS实现数组随机排序的方法有哪些

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容介绍了"JS实现数组随机排序的方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.利
千家信息网最后更新 2026年10月31日JS实现数组随机排序的方法有哪些

本篇内容介绍了"JS实现数组随机排序的方法有哪些"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.利用数组方法sort实现随机排序

实现随机排序方法还是很多的,用for循环是可以写的,用Lodash等三方js方法库也行。但个人以为使用sort比较方便,但是他又缺点,缺点就是不够那么的随机,我看过sort运行机制后,发现他竟然是利用一个比较器两两比较出来的。

var arr = [1, 2, 3, 4, 5] arr.sort(function () {  return Math.random() - 0.5})console.log(arr);

2.洗牌算法实现随机排序

从原始数组中每次随机选中一个元素,然后放入新数组中,每取出一个元素后,将将它从原数组中取出(使用splice方法),原数组长度减一。

举例:

现在我有红桃K、黑桃A、小王三张牌,要求打乱顺序,你可以从三张牌抽出任意一张,假设你抽到的是小王,那么我手里三张牌变成两张牌,你手里变成1张牌,以此类推,实现随机排序。

代码实现:

function shuffle(array){    let res = [], random;    while(array.length>0){        random = Math.floor(Math.random()*array.length);        res.push(array[random]);        array.splice(random, 1);    }    return res;} console.log(shuffle([1,2,3,4,5]));

3.洗牌算法深入分析

思路:我有一副牌,随机抽取牌,旧的牌数量相应减少!

function shuffle(m) //洗牌 //抽牌法{//生成m张牌var arr = new Array(m);for (var i=0; i0; i-) {var rnd = Math.floor(Math.random()*i);arr2.push(arr[rnd]);arr.splice(rnd,1);}return arr2;}

但是这样的话,因为数组如果很大的话,删除中间的某个元素,会导致后面的数据被执行,会对性能影响很大。

我们删除那个元素的目的就是为了不产生空牌。

除了删除那个元素之外,我们是不是还有其它方式来去除空牌?

只需把最后一张未抽的牌放在那个抽走的位置上就可以了。

顺着这个思路我们可以优化成这样:

代码如下:

function shuffle_pick(m) //洗牌 //抽牌法优化牌{//生成m张牌var arr = new Array(m);for (var i=0; i0;) {var rnd = Math.floor(Math.random()*i);arr2.push(arr[rnd]);arr[rnd] = arr[-i];}return arr2;}

除了抽牌思路,我们还可以用换牌思路:

"随机交换两个位置,共交换n次,n越大,越接近随机"。

顺着这个思路,做一点小调整就可以了:第i张与任意一张牌换位子,换完一轮即可。

代码如下:

function shuffle_swap(m) //洗牌 //换牌法{//生成m张牌var arr = new Array(m);for (var i=0; i

除了抽牌与换牌的思路,我们还可以用插牌的思路:先有一张牌,第二张牌有两个位置可随机插入(第一张牌前,或后),第三张牌有三个位置可随机插入(放在后面,或插在第一位,或插在第二位),依此类推

代码如下:

function shuffle_insert_1(m) //洗牌 //插牌法{//每次生成一张最大的牌,插在随机的某张牌前。因为要在数组里插入元素,把后面的所有元素向后挤一位,所以很耗时。var arr = [0];for (var i=1; i

以上的代码也会有一些问题:就是随着牌数的增多,插牌变得越来越困难,因为插牌会导致后面的很多牌都往后推一步。

当然,我们也可以适当的优化一下:先有n-1张牌,第n张牌放在最后,然后与任意一张牌互换位置。

代码如下:

function shuffle_insert(m) //洗牌 //插牌法优化版,可以用数学归纳法证明,这种洗牌是均匀的。{//每次生成一张最大的牌,与随机的某张牌换位子var arr = new Array(m);arr[0] = 0;for (var i=1; i

全部代码

代码如下:

function shuffle_pick_1(m) //洗牌 //抽牌法{//生成m张牌var arr = new Array(m);for (var i=0; i0; i-) {var rnd = Math.floor(Math.random()*i);arr2.push(arr[rnd]);arr.splice(rnd,1);}return arr2;}function shuffle_pick(m) //洗牌 //抽牌法优化牌{//生成m张牌var arr = new Array(m);for (var i=0; i0;) {var rnd = Math.floor(Math.random()*i);arr2.push(arr[rnd]);arr[rnd] = arr[-i];}return arr2;}function shuffle_swap(m) //洗牌 //换牌法{//生成m张牌var arr = new Array(m);for (var i=0; i

"JS实现数组随机排序的方法有哪些"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

数组 生成 元素 代码 思路 方法 排序 位子 位置 最大 就是 算法 一轮 很大 两个 内容 归纳法 数学 数学归纳法 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 互联网科技名片 哈尔滨大商圈互联网科技有限公司 互联网科技工作委员会 互联网科技英文翻译 哈尔滨新华互联网科技 互联网公司会议桌创意科技软装饰 华中科技有哪些互联网大佬 老年人脱离互联网科技的作文 宁波青枫互联网科技有限公司 中国的互联网科技企业的崛起 恒生互联网科技指数跳水 电子科技大学互联网创业大赛 互联网科技的全部知识 互联网科技公司营业执照怎么办理 互联网科技数字货币 九思连强互联网电子科技有限公司 科技互联网行业投资研究 互联网科技手机排行榜 科技互联网企业在行动 互联网科技公司 互联网与未来科技 远拓互联网科技 四川狮子座互联网科技 互联网金融监管科技 四川慕妮娅互联网科技有限公司 工业互联网展湾科技股份有限公司 北京军民互联网科技公司 重庆科技产业互联网有哪些 北京瑞云互联网科技有限公司
0