实现随机数组方法总结

1,750 阅读2分钟

前言

翻阅了一些资料,思考许久后,给大家整理出几种可以实现随机数组的方法。一起来看看都有哪些吧~


一、方案一

1. 实现思路

使用Array的sort方法和Math的random方法

数组sort方法可以传入一个用来指定按某种顺序进行排列的函数,如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。

如果参数小于0 就交换位置 ,如果参数大于0就不交换位置 。接下来用刚才的较大数字跟下一个进行比较。

使用Math提供的random方法,这个方法默认生成0~1之间的随机小数。我们在其基础上-0.5,传入数组的sort方法中,可以来帮助我们进行随机排序。

2. 代码演示

代码如下(示例):

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]

arr.sort(function(){
    return Math.random() - 0.5
})

或者使用ES6箭头函数改写

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]

arr.sort(() => Math.random() - 0.5)

3. 缺点

使用这个方法貌似实现了我们想要随机数组的需求,随后我看了这位JackieDYH大佬分析后, 觉得这样实现随机数组的确有一些不随机,感兴趣的小伙伴儿可以看一下原文。

二、方案二

1. Fisher-Yates shuffle(洗牌算法)

lodash中提供了shuffle方法,基于洗牌算法来实现的,可以快速实现随机数组。

lodash官网:lodash lodash官方文档:shuffle方法

这里就不给大家演示了,可以点击链接去看看如何使用。

2. es6实现

代码如下(示例):

function shuffle(arr) {
    let i = arr.length 
    while (i) {
        let j = Math.floor(Math.random() * i--)
        ;[arr[j], arr[i]] = [arr[i], arr[j]]
    }
    return arr
}

3. es5实现

function randSort1(arr) {
    for (var i = 0, len = arr.length; i < len; i++) {
        var rand = parseInt(Math.random() * len)
  	var temp = arr[rand]

	arr[rand] = arr[i]
	arr[i] = temp
    }

    return arr
}

三、方案三

1. 实现思路

每生成一个随机数,就作为下标从原数组中取一个元素放入新数组中,同时将原数组中的值删除掉。

2. 代码演示

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]

function randomArr(arr) {
    let newArr = []
	// 判断原数组长度是否大于0
    while (arr.length > 0) {
    	let random = Math.floor(Math.random() * arr.length)
    	// 向新数组中添加
        newArr.push(arr[random])
        // 将原数组中的删除
        arr.splice(random, 1)
    }
    
    return newArr
}

console.log(randomArr(arr))

3. 缺点

会影响到原数组


总结

个人觉得使用方案二很适合,有什么问题,欢迎评论区留言一起讨论~