JS 生成随机数或随机字符串
math.random()
math.random()方法返回一个伪随机浮点数,结果区间为[0, 1),在区间内近似均匀分布,可以使用别的方法缩放到所需的范围。它实现了选择初始值的随机数生成算法;使用者无法主动选择值或进行重置。
Math.random();
// 0.21446359414239313
Math.random 会提供给我们一个[0,1)之间的随机数,但是如果我们要[1,10]范围随机整数的话,可以使用以下三个函数:
- math.round() 四舍五入
- math.ceil() 向上取整
- math.floor() 向下取整
Math.ceil(Math.random() * 10);
// 7
快速生成随机字符串
利用 toString,hex 代表进制,最大不能超过 36,36 = 10 + 26 个英文字母 hex 越大,字母占比越多
Math.random().toString(36).slice(2);
注意:
- 该方式无法保证字符串长度一致
- 当 Math.random()的结果是有限长度小数时,比如 0.5,0.55,会导致得到的结果不符合预期
测试
// 十万次
var a = Array.from(new Array(100000).keys());
var b = a.map((i) => Math.random().toString(36).slice(2));
new Set(Object.values(b.map((i) => i.length)));
// Set(8) {10, 11, 9, 12, 8, 13, 14, 7}
可以自己试一下,每次运行的结果可能是不同的,其原因是 Math.random()生成的数字保留的小数长度本身是不固定的
// 百万次
var a = Array.from(new Array(1000000).keys());
new Set(Object.values(a.map((i) => (Math.random() + "").length)));
// Set(14) {19, 18, 17, 20, 16, 21, 22, 15, 14, 13, 23, 11, 24, 12}
快速生成固定长度的随机字符串
/**
* 生成指定长度的字符串
* @param {Number} hex 代表进制,取值范围[2 - 36],最大不能超过 36, 数字越大字母占比越高,小于11为全数字
* @param {Number} len 字符串长度
*/
function generateStr(hex, len) {
if (hex < 2 || hex > 36) {
throw new RangeError("hex argument must be between 2 and 36");
}
var res = Math.random().toString(hex).slice(2);
var resLen = res.length;
while (resLen < len) {
res += Math.random().toString(hex).slice(2);
resLen = res.length;
}
return res.substr(0, len);
}
测试
// 执行十万次,可以在50ms左右稳定获取长度为10的随机字符串
console.time("exec");
var a = Array.from(new Array(100000).keys());
console.log(new Set(a.map((i) => generateStr(22, 10).length)));
console.timeEnd("exec");
// Set(1) {10}
// exec: 49.966064453125 ms