JavaScript实现随机产生字符串的方法分享

 更新时间:2022年11月29日 10:54:46   作者:KjPrime  
这篇文章主要为大家详细介绍了JavaScript中实现随机产生字符串的方法,文中的示例代码简洁易懂,对我们学习JavaScript有一定的帮助,需要的可以参考一下

这个东西就是随机产生字符串的函数。

参数,代码里面有解释。

用途:当作产生随机密码来看使用吧,或者nodejs后端存储数据库的主键来使用吧。

/**
 * 这个是一个随机产生字符串的函数
 * @param {object} cfg 参数
    cfg = {
        split:  '',                 // 分割字符 
        splitNum: 0,                // 分隔个数
        num: 16,                    // 产生随机字符个数 默认16
        char: 'dAa',                // d数字 A大写的字符 a小写的字符  默认dAa
        append: '@*!+-=*&[()`?.]',  // 添加的其他额外字符,支持数组[]和字符串 默认@*!+-=*&[()`?.
        ignore: '',                 // 可以忽略的字符,支持数组[]和字符串 优先级最高 
    }
 * @returns 返回随机字符串
 */
const rand_str = (cfg) => {
    if(cfg === undefined) cfg = {}
    const getValue = (s, d) => {
        if([undefined, null].includes(s)) return d
        else return s
    }
    cfg = {
        split:  getValue(cfg.split, ''),    // 分割字符 
        splitNum: parseInt(cfg.splitNum) || 0,   // 分隔个数
        num: parseInt(cfg.num) || 16,             // 字符个数 默认16
        char: getValue(cfg.char, 'dAa') ,        // d数字 A大写的字符 a小写的字符
        append: getValue(cfg.append, '@*!+-=*&[()`?.') , // 支持数组[]和字符串 一般指特殊字符@*!+-=*&[()`?.
        ignore: getValue(cfg.ignore, '')                       // 支持数组[]和字符串 优先级最高 
    }
    // console.log(cfg)
    let set = new Set()
    const getChars = (str) => {
        for(const s of str) set.add(s)
    }
    // 1、先取出append特殊字符的编码
    getChars(cfg.append)
    // 2、获取char中的字符集
    const number = "0123456789"
    const bigChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    const smallChars = "abcdefghijklmnopqrstuvwxyz"
    for(const s of cfg.char) {
        if(s === 'd') getChars(number)
        else if (s === 'A') getChars(bigChars)
        else if (s === 'a') getChars(smallChars)
        // 其他的字符 自动忽略
    }
    // 3. 排除ignore忽略的元素
    for(const s of cfg.ignore) set.delete(s)
    // 4. 生成数组
    const arr = Array.from(set)
    // console.log(arr)
    // 5. 打乱集合 
    const swap = (firstIndex, secondIdex) => {
        const t = arr[firstIndex]
        arr[firstIndex] = arr[secondIdex]
        arr[secondIdex] = t
    }
    const size = arr.length
    for(let i = 0; i < cfg.num; i++) swap(Math.floor(Math.random() * size), Math.floor(Math.random() * size))
    // 6、生成随机字符串
    let re = ""
    for(let i = 0; i < cfg.num; i++) {
        if(i % cfg.splitNum === 0 && i !== 0) re += cfg.split
        re += arr[Math.floor(Math.random() * size)]
    }
    return re
}




/**
 * 测试
 */
for(let i = 1; i< 10; i++) console.log(rand_str())
console.log('----------------------------')
const config = {
    split:  '',                 // 分割字符 
    splitNum: 0,                // 分隔个数
    num: 20,                    // 产生随机字符个数 默认16
    char: 'Aa',                // d数字 A大写的字符 a小写的字符  默认dAa
    append: '@*!+-=*&[()`?.]',  // 添加的其他额外字符,支持数组[]和字符串 默认@*!+-=*&[()`?.
    ignore: '@*!+-=*&[()`?.]',  // 可以忽略的字符,支持数组[]和字符串 优先级最高 
}
for(let i = 1; i< 10; i++) console.log(rand_str(config))

知识点补充

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

到此这篇关于JavaScript实现随机产生字符串的方法分享的文章就介绍到这了,更多相关JavaScript随机产生字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 微信小程序websocket实现即时聊天功能

    微信小程序websocket实现即时聊天功能

    这篇文章主要为大家详细介绍了微信小程序websocket实现即时聊天功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • 超链接怎么正确调用javascript函数

    超链接怎么正确调用javascript函数

    本文介绍使用超链接调用javasript函数且不会影响GIF图片动画的方法,有遇到相同问题的小伙伴可以参考一下。
    2016-05-05
  • 基于JS实现漫画中大雨滂沱的效果

    基于JS实现漫画中大雨滂沱的效果

    这篇文章主要为大家详细介绍了如何利用JavaScript实现漫画中大雨滂沱的效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 原生JS实现萤火虫效果

    原生JS实现萤火虫效果

    这篇文章主要为大家详细介绍了原生JS实现萤火虫效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • JavaScript自定义localStorage监听事件的解决方法

    JavaScript自定义localStorage监听事件的解决方法

    在项目开发过程中,发现有很多时候进行localStorage.setItem()操作设置本地存储后,页面必须刷新才能够获取到存储数据,为了解决这个问题,就必须要用到自定义localStorage监听事件了,所以本文给大家介绍了自定义localStorage监听事件,需要的朋友可以参考下
    2024-10-10
  • JS遍历Json字符串中键值对先转成JSON对象再遍历

    JS遍历Json字符串中键值对先转成JSON对象再遍历

    这篇文章主要介绍了JS遍历Json字符串中键值对的方法,先将Json字符串转换成JSON对象,再进行遍历,需要的朋友可以参考下
    2014-08-08
  • javascript中的some方法使用解读

    javascript中的some方法使用解读

    这篇文章主要介绍了javascript中的some方法使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Bootstrap基本组件学习笔记之按钮组(8)

    Bootstrap基本组件学习笔记之按钮组(8)

    这篇文章主要为大家详细介绍了Bootstrap基本组件学习笔记之按钮组,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能

    js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能

    最近支付宝的领红包可真是刷爆了各个微信群啊,满群都是支付宝口令,可是这样推广很麻烦,下面小编给大家带来了js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能,需要的朋友参考下
    2018-01-01
  • document.getElementById方法在Firefox与IE中的区别

    document.getElementById方法在Firefox与IE中的区别

    相信很多朋友在写JavaScript的时候,对浏览器的兼容问题会感到很头疼。这不,烦什么,什么就来了,特记录下来,与大家分享。
    2010-05-05

最新评论