数组完全乱序
时间:2022-07-28
本文章向大家介绍数组完全乱序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数组完全乱序
一提到数组乱序,大家可能就会想到sort
方法,也就是下面这种实现方法:
arr.sort(() => 0.5 - Math.random());
但是sort
并不是真正意义上的乱序,一些元素间并没有机会相互比较(也就没有了随机交换的可能性),所有数组元素在大概率上还停留在自己初始位置。
这里不再展开了,省的懵逼,如果对此有兴趣的话,看这篇文章来解惑。
真正意义上的乱序数组:
递归:
原理:
- 取数组长度的随机数,获取这个数组元素
- 删除原数组的元素,将值添加到新数组中
- 递归将数组再传入函数(重复上述两步),直到旧数组的元素清空为止
let oldArr = [1, 2, 3, 4, 5, 2, 8, 9, 10, 11];
let randomFn = actionArr => {
let newArr = [];
let randomArr = arr => {
let ranDomNum = Math.floor(Math.random() * arr.length); // 随机数
newArr.push(actionArr.splice(ranDomNum, 1)[0]); // 删除原数组元素 将删除的值添加到新数组
if (arr.length !== 0) {
return randomArr(actionArr);
} else {
return; // 数组清空 退出递归
}
};
randomArr(actionArr);
return newArr;
};
console.log(randomFn(oldArr), '新数组');
循环(进阶):
原理都一样,将递归换成了循环,这种方式无疑是更优雅的(虽然上面才是我写的…)。
let randomFn = actionArr => {
let newArr = [],
n = actionArr.length,
i;
while (n) {
i = Math.floor(Math.random() * n--); // 获取随机数(0~数组的长度-1)
newArr.push(array.splice(i, 1)[0]); // 删除原数组元素 将删除的值添加到新数组
}
return newArr;
};
不开新数组(最终):
上述方法创建了一个新数组,开辟了新的内存空间。
原理:
- 因为每次循环,数组的长度都要减去1,数组长度的最大值是一个一个减少的
- 把当前找到的随机元素,保存在每次循环的最大值的位置
- 再把最后一个被替换的元素,放到随机元素原来的位置
- 就是把这两个元素交换变量
function shuffle(array) {
var m = array.length,
t,
i;
while (m) {
i = Math.floor(Math.random() * m--);
[array[i], array[m]] = [array[m], array[i]]; // 交换变量 ES6的写法
}
return array;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java 数组转 List 的三种方式及对比
- C#代码折叠#region
- c#实时显示时间 C#-WinForm-Timer控件
- 记一次 JAVA 的内存泄露分析
- for循环、递归、回溯
- delete 后加 limit 是个好习惯么?!
- @Component,@Service 等注解是如何被解析的
- 怎么摆脱又臭又长的 Git 命令?
- Redis 怎么防止数据丢失?面试必问!
- 使用vs2015编写c语言的方法
- 哪些场景会产生OOM?怎么解决?
- 预处理命令
- IntelliJ IDEA 调试 Java 8 Stream,实在太香了!
- 仅需四步,写一个 Spring Boot Starter
- 一个简单案例,带你看懂GC日志!