shfshanyue / Daily-Question

互联网大厂内推及大厂面经整理,并且每天一道面试题推送。每天五分钟,半年大厂中
https://q.shanyue.tech
4.94k stars 510 forks source link

【Q619】使用 JS 如何生成一个随机字符串 #637

Open shfshanyue opened 3 years ago

shfshanyue commented 3 years ago

random 接收一个整数作为随机数的个数,最多生成8个随机数

// 'a839ac'
random(6)

// '8abc'
random(4)
shfshanyue commented 3 years ago
const random = (n) => Math.random().toString(36).slice(2, 2 + n)

random()
// => "c1gdm2"
random()
// => "oir5pp"
wangjs-jacky commented 2 years ago

山月老师给出的答案:使用 Math.random 产生的随机数进行 36 进制转化,该随机数是由0-9,a-z 构成的。

还有一种方案是对大写字母,小写字母以及数字的 ASCII 码进行转化。

random_v1(4);
random_v1(6);

// ASCII:
// 大写字母:65~90
// 小写字母:97~122
// 数字:48-57
function random_v1(num: number) {
  let b = new Array(num)
    .fill(0)
    .map(() => String.fromCharCode(generateAcsii()))
    .join("");
  console.log(b);
}

function generateAcsii() {
  // 生成 [65,90] && [97,122] && [48,51]
  let a = Math.floor(Math.random() * 62); // [0,62]
  if (a < 26) {
    //  返回 大写字母 的 ASCII
    return a + 65;
  } else if (a >= 26 && a < 52) {
    //  返回 小写字母 的 ASCII
    return a - 26 + 97;
  } else {
    //  返回 数字 的 ASCII
    return a - 52 + 48;
  }
}