JS实现生成由字母与数字组合的随机字符串功能详解


Posted in Javascript onMay 25, 2018

本文实例讲述了JS实现生成由字母与数字组合的随机字符串功能。分享给大家供大家参考,具体如下:

在项目中可能需要随机生成字母数字组成的字符,如生成3-32位长度的字母数字组合的随机字符串(位数不固定)或者生成43位随机字符串(位数固定)

使用Math.random()与toString()方法的结合

先看一下这个方式:

Math.random().toString(36);

结果:

0.9kfiead48n

toString后的参数规定可以是2-36之间的任意整数,不写的话默认是10(也就是十进制),此时返回的值就是那个随机数。

若是偶数,返回的数值字符串都是短的,若是奇数,则返回的将是一个很大长度的表示值。
若<10 则都是数字组成,>10 才会包含字母。

所以如果想得到一长串的随机字符,则需使用一个 > 10 且是奇数的参数。但是由于返回的是小数点,所以需要截取,可以使用slice(2) 。这儿使用substr()方法。如下:

Math.random().toString(36).substr(2);

结果:

p3bz2xrzsam

但是上面的方式只是随机了,位数不确定。怎样来控制在一个范围或者固定的位数呢?看下面的方法。

常规的函数写法

/** 随机生成固定位数或者一定范围内的字符串数字组合
 * @param {Number} min 范围最小值
 * @param {Number} max 范围最大值,当不传递时表示生成指定位数的组合
 * @returns {String} 返回字符串结果
 * */
function randomRange(min, max){
 var returnStr = "",
  range = (max ? Math.round(Math.random() * (max-min)) + min : min),
  arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
 for(var i=0; i<range; i++){
  var index = Math.round(Math.random() * (arr.length-1));
  returnStr += arr[index];
 }
 return returnStr;
}
var rand01 = randomRange(10,22);
var rand02 = randomRange(10,36);
var rand03 = randomRange(10);
var rand04 = randomRange(10);

结果:

VkdWQnIOKntsp
UoUUNtGJrHVl7UMc9jlvYjUr
1F1ck8I7yV
SEPGPzuO5F

函数写法优化

想想上面的arr这样写太繁琐,也可以写成字符串的形式,实现方式也差不多只是稍微变一下:

function randomRange(min, max){
 var returnStr = "",
  range = (max ? Math.round(Math.random() * (max-min)) + min : min),
  charStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 for(var i=0; i<range; i++){
  var index = Math.round(Math.random() * (charStr.length-1));
  returnStr += charStr.substring(index,index+1);
 }
 return returnStr;
}
var rand01 = randomRange(10,22);
var rand02 = randomRange(10,36);
var rand03 = randomRange(10);
var rand04 = randomRange(10);

结果:

Jpjtfe4S7aOSUAiGuYwK
n1mR5bDNf4jRBfM
j6HaBH7fZl
KbbHNw8V4Y

扩展:从指定的字符串生成组合

/** 随机生成固定位数或者一定范围内的字符串数字组合
 * @param {Number} min 范围最小值
 * @param {Number} max 范围最大值,当不传递时表示生成指定位数的组合
 * @param {String} charStr指定的字符串中生成组合
 * @returns {String} 返回字符串结果
 * */
function randomRange(min, max, charStr){
 var returnStr = "",
  range;
  if(typeof max == 'string'){
   charStr = max;
  }
  range = ((max && typeof max == 'number') ? Math.round(Math.random() * (max-min)) + min : min);
  charStr = charStr || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 for(var i=0; i<range; i++){
  var index = Math.round(Math.random() * (charStr.length-1));
  returnStr += charStr.substring(index,index+1);
 }
 return returnStr;
}
var rand01 = randomRange(10,22);
var rand02 = randomRange(5,8,'abcdef012');
var rand03 = randomRange(10);
var rand04 = randomRange(5,'123');

结果:

La2vVO4jrXZlHVLBs8b5K
1bc0cd1
ae888oluQX
32232

进一步优化,不传递参数,默认生成指定位数的字符串组合

/** 随机生成固定位数或者一定范围内的字符串数字组合
 * @param {Number} min 范围最小值
 * @param {Number} max 范围最大值,当不传递时表示生成指定位数的组合
 * @param {String} charStr指定的字符串中生成组合
 * @returns {String} 返回字符串结果
 * */
function randomRange(min, max, charStr){
 var returnStr = "",
  range;
 if(typeof min == 'undefined'){
  min = 10;
 }
  if(typeof max == 'string'){
   charStr = max;
  }
  range = ((max && typeof max == 'number') ? Math.round(Math.random() * (max-min)) + min : min);
  charStr = charStr || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 for(var i=0; i<range; i++){
  var index = Math.round(Math.random() * (charStr.length-1));
  returnStr += charStr.substring(index,index+1);
 }
 return returnStr;
}
var rand01 = randomRange();

结果:

ohcjkCLtuL

在优化,根据ASCII码生成组合

通过打印:

console.log('9'.charCodeAt(0)); //0-9ASCII范围:48-57
console.log('a'.charCodeAt(0));// a-zASCII范围:97-122
console.log('A'.charCodeAt(0));// A-ZASCII范围:65-90

常见字符对应的ASCII码

a-z 97-122
A-Z 65-90
0-9 45-57

其实知道了这个我们就不需要写那么长的charStr字符串

/** 随机生成固定位数或者一定范围内的字符串数字组合
 * @param {Number} min 范围最小值
 * @param {Number} max 范围最大值,当不传递时表示生成指定位数的组合
 * @param {String} charStr指定的字符串中生成组合
 * @returns {String} 返回字符串结果
 * */
function randomRange(min, max, charStr){
 var returnStr = "", //返回的字符串
  range; //生成的字符串长度
 //随机生成字符
 var autoGetStr = function(){
  var charFun = function(){
   var n= Math.floor(Math.random()*62);
   if(n<10){
    return n; //1-10
   }
   else if(n<36){
    return String.fromCharCode(n+55); //A-Z
   }
   else{
    return String.fromCharCode(n+61); //a-z
   }
  }
  while(returnStr.length< range){
   returnStr += charFun();
  }
 };
 //根据指定的字符串中生成组合
 var accordCharStrGet = function(){
  for(var i=0; i<range; i++){
   var index = Math.round(Math.random() * (charStr.length-1));
   returnStr += charStr.substring(index,index+1);
  }
 };
 if(typeof min == 'undefined'){
  min = 10;
 }
  if(typeof max == 'string'){
   charStr = max;
  }
  range = ((max && typeof max == 'number') ? Math.round(Math.random() * (max-min)) + min : min);
  if(charStr){
   accordCharStrGet();
  }else{
   autoGetStr();
  }
 return returnStr;
}
var rand01 = randomRange();
var rand02 = randomRange(5,8,'abcdef012');
var rand03 = randomRange(10);
var rand04 = randomRange(5,'123');

结果:

S0yIEsPj4Q
dff0d
Zx93g07ewD
22232

参考文章

Javascript 相关文章推荐
jQuery Flash/MP3/Video多媒体插件
Jan 18 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
Jun 29 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
Dec 27 Javascript
JS实现图片翻书效果示例代码
Sep 09 Javascript
用js格式化金额可设置保留的小数位数
May 09 Javascript
JavaScript中的函数嵌套使用
Jun 04 Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 Javascript
javascript实现的图片预览功能
Mar 25 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
Nov 22 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
Jun 09 jQuery
layui表格数据重载
Jul 27 Javascript
vue使用echarts实现水平柱形图实例
Sep 09 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
May 25 #Javascript
JS简单生成由字母数字组合随机字符串示例
May 25 #Javascript
Webpack中雪碧图插件使用详解
May 25 #Javascript
使用javascript做在线算法编程
May 25 #Javascript
JS实现的汉字与Unicode码相互转化功能分析
May 25 #Javascript
浅析node.js的模块加载机制
May 25 #Javascript
webpack4的迁移的使用方法
May 25 #Javascript
You might like
怎样在UNIX系统下安装php3
2006/10/09 PHP
来自PHP.NET的入门教程
2006/10/09 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP实现递归的三种方法
2020/07/04 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
Python 判断奇数偶数的方法
2018/12/20 Python
python利用dlib获取人脸的68个landmark
2019/11/27 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
recorder.js 基于Html5录音功能的实现
2020/05/26 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
安全资料员岗位职责
2013/12/14 职场文书
会计学自我鉴定
2014/02/06 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
专业技术职务聘任证明
2015/03/02 职场文书
客户付款通知书
2015/04/23 职场文书
2015年计划生育责任书
2015/05/08 职场文书
交通事故调解协议书
2015/05/20 职场文书
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android