JS 生成隨機數或隨機字符串


math.random()

math.random()方法返回一個偽隨機浮點數,結果區間為[0, 1),在區間內近似均勻分布,可以使用別的方法縮放到所需的范圍。它實現了選擇初始值的隨機數生成算法;使用者無法主動選擇值或進行重置。

Math.random();
// 0.21446359414239313

Math.random 會提供給我們一個[0,1)之間的隨機數,但是如果我們要[1,10]范圍隨機整數的話,可以使用以下三個函數:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM