专业编程基础技术教程

网站首页 > 基础教程 正文

JavaScript 常用方法一、JS生成随机字符串

ccvgpt 2024-07-19 12:49:11 基础教程 27 ℃

一、JS生成随机字符串

第一种:内置函数方法

Math.random(); //该方法产生一个0到1之间的浮点数。
延伸:
 Math.floor(Math.random()*10+1); //生成1-10的随机数
 Math.floor(Math.random()*10);//生成0-9的随机数
 函数方法:
 function rand ( n )
 {
 return ( Math.floor ( Math.random ( ) * n + 1 ) );
 }

// 调用方法
rand(100);生成1-100的随机数。

第二种:奇妙的写法(最近凑的解决方案)

JavaScript 常用方法一、JS生成随机字符串

优雅的获取数字+字母组成的字符串
Math.random().toString(36).slice(-8)
或者:
(+new Date).toString(36).slice(-5);

Math.random(); // 结果为0-1间的一个随机数(包括0,不包括1) 
.toString(36) // 将数字转换为基数为36的字符串,即使用字符0-9和az。
.slice(-8);				 // 截取最后八位 : "yo82mvyr"

36进制包含的字符为 0-9,a-z
10进制包含的字符为为 0-9
16进制包含的字符为 0-9,a-f

缺点:
 只能生成有 0-9、a-z字符组成的字符串
 由于 Math.random()生成的18位小数,可能无法填充36位,最后几个字符串,只能在指定的几个字符中选择。导致随机性降低。
 某些情况下会返回空值。例如,当随机数为 0, 0.5, 0.25, 0.125...时,返回为空值。
 在我的电脑上执行这种方式生成字符串。1000万次中出现重复的概率为 0。

改进:
 (Math.random().toString(36)+'00000000000000000').slice(2, N+2)

其次,上面的原始和解决方案都将字符串大小N限制为16个字符。 以下将返回任意N的大小为N的字符串(但请注意,使用N> 16不会增加随机性或降低碰撞概率):
Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)
说明:
 1、在[0,1)范围内选取一个随机数,即在0(包含)和1(不包括)之间。
 将数字转换为基数为36的字符串,即使用字符0-9和az。
 2、用零填充(解决第一个问题)。
 3、切掉领先的'0'。 前缀和额外填充零。
 4、重复该字符串足够多的时间以使其中至少有N个字符(通过使用较短的随机字符串作为分隔符加入空字符串)。
 5、从字符串中切分N个字符。
更多的想法:
 1、这个解决方案不使用大写字母,但几乎在所有情况下(没有双关语意思),这并不重要。
 2、在Chrome中测量原始答案中N = 16时的最大字符串长度。 在Firefox中,它的N = 11。但正如所解释的,第二种解决方案是支持任何请求的字符串长度,而不是添加随机性,所以它没有太大区别。
 3、所有返回的字符串返回的概率相等,至少就Math.random()返回的结果均匀分布(在任何情况下,这不是密码强度随机性)。
 4、并非所有可能的大小为N的字符串都可能被返回。 在第二种解决方案中,这是显而易见的(因为较小的字符串仅被复制),但在原始答案中也是如此,因为在转换为基数-36时,最后几位可能不是原始随机位的一部分。 具体来说,如果您查看Math.random()。toString(36)的结果,您会注意到最后一个字符不是均匀分布的。 同样,在几乎所有情况下,它都没有关系,但是我们从最开始的字符串开始,而不是随机字符串的结尾,以便短字符串(例如N = 1)不受影响。

第三种:自定义函数(生成指定位数的数字字母混合的字符串)

/**
 * randomWord 产生任意长度随机字母数字组合
 * @param randomFlag 是否任意长度 min-任意长度最小位[固定位数] max-任意长度最大位
 * @param min
 * @param max
 * @returns {string}
 */
function randomWord(randomFlag, min, max){
 var str = "",
 range = 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'];
 // 随机产生
 if(randomFlag){
 range = Math.round(Math.random() * (max-min)) + min;
 }
 for(var i=0; i<range; i++){
 pos = Math.round(Math.random() * (arr.length-1));
 str += arr[pos];
 }
 return str;
}

调用方法
// 生成 3 - 32 位随即字符串
randomWord(true,3,32); // 例如:olyOXUF5oDsuMmXl3Mi48
// 生成 32 位随机字符串
randomWord(false,32); // 例如:fjpnWj29Bb8boiXbLeDF0nxkR4aYcLRl

第四种:不需要输入字符集合

function randomstring(L){
 var s= '';
 var randomchar=function(){
 	var n= Math.floor(Math.random()*62);
 	if(n<10) return n; //1-10
 	if(n<36) return String.fromCharCode(n+55); //A-Z
 	return String.fromCharCode(n+61); //a-z
 }
 while(s.length< L) s+= randomchar();
 return s;
}

// 调用方法
randomstring(5);

第五种:支持自定义字符长度和特征字符集合

function randomString(len, charSet) {
 charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
 var randomString = '';
 for (var i = 0; i < len; i++) {
 	var randomPoz = Math.floor(Math.random() * charSet.length);
 	randomString += charSet.substring(randomPoz,randomPoz+1);
 }
 return randomString;
}

// 调用方法
var randomValue = randomString(5);
var randomValue = randomString(5, 'PICKCHARSFROMTHISSET');

第六种:最轻量级的方式(代码轻,而不是CPU)

function rand(length, current) {
 current = current ? current : '';
 return length ? rand(--length, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".charAt(Math.floor(Math.random() * 60)) + current) : current;
}
console.log(rand(5));

第七种:在循环中使用它,它可能不是5个字符,但保证每个ID是唯一的

var newId ="randomid_" +
 (Math.random() / +new Date()).toString(36).replace(/[^a-z]+/g, '');

Tags:

最近发表
标签列表