前言
翻阅了一些资料,思考许久后,给大家整理出几种可以实现随机数组的方法。一起来看看都有哪些吧~
一、方案一
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. 缺点
会影响到原数组
总结
个人觉得使用方案二很适合,有什么问题,欢迎评论区留言一起讨论~