我想使用Javascript以这种格式生成一行数字和字母。
示例:F35-HE4E-WAD-32S
所以随机数字和字母的3-4-3-3行。
答案 0 :(得分:4)
我会创建一个生成与给定模板匹配的随机序列的函数。像这样:
function getSequence(template) {
var r = '', ch, n;
for (var i = 0; i < template.length; i++) {
ch = template.substr(i, 1);
if (ch == "d") {
r += parseInt(Math.random() * 10);
} else if (ch == "A") {
r += String.fromCharCode(65 + parseInt(Math.random() * 26));
} else if (ch == "w") {
n = parseInt(Math.random() * 36);
if (n > 9) {
r += String.fromCharCode(55 + n);
} else {
r += n;
}
} else {
r += ch;
}
}
return r;
}
console.log(getSequence('Add-wwww-AAA-ddA'));
在给出的例子中,'A'用于大写字母,'d'用于数字(数字),'w'用于任何一个。所以'Add-wwww'将返回一个大写字母,两个数字,一个连字符,然后是四个字符的序列,可以是字母或数字。然后,您可以根据所需的顺序进行调整。
EDIT。也许更简洁,更可重用的实现是创建一个函数,将模板字符转换为从相应字符集中挑选的随机字符,然后调用Array.map
将该函数应用于模板字符串的每个字符。
var CHAR_SETS = {
d: '0123456789',
A: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
w: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
};
function mapString(s, func) {
return Array.prototype.map.call(s, func).join('')
}
function randChar(charType) {
var chars = CHAR_SETS[charType];
if (chars) {
return chars.charAt(parseInt(Math.random() * chars.length));
} else {
return charType;
}
}
console.log(mapString('Add-wwww-AAA-ddA', randChar));
http://jsfiddle.net/49hofey8/2/
另一种选择是使用replace
:
var CHAR_SETS = {
d: '0123456789',
A: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
w: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
};
function randChar(charType) {
var chars = CHAR_SETS[charType];
return chars.charAt(parseInt(Math.random() * chars.length));
}
console.log('Add-wwww-AAA-ddA'.replace(/[Adw]/g, randChar));
答案 1 :(得分:1)
我会使用更通用的东西。然后你可以将你的函数重用于其他代码目的。
Number.MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
Number.MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -Number.MAX_SAFE_INTEGER;
Number.toInteger = Number.toInteger || function(inputArg) {
var number = +inputArg,
val = 0;
if (number === number) {
if (!number || number === Infinity || number === -Infinity) {
val = number;
} else {
val = (number > 0 || -1) * Math.floor(Math.abs(number));
}
}
return val;
};
function clampSafeInt(number) {
return Math.min(Math.max(Number.toInteger(number), Number.MIN_SAFE_INTEGER), Number.MAX_SAFE_INTEGER);
}
Array.isArray = Array.isArray || function(inputArg) {
return {}.toString.call(inputArg) === '[object Array]';
}
function isString(inputArg) {
return {}.toString.call(inputArg) === '[object String]';
}
function generateChars(first, last) {
first = isString(first) && first.length ? first.charCodeAt(0) : 0;
last = isString(last) && last.length ? last.charCodeAt(0) : 0;
var chars = [],
index;
for (index = first; index <= last; index += 1) {
chars.push(String.fromCharCode(index));
}
return chars;
}
function randomInt(min, max) {
var tmp,
val;
if (arguments.length === 1) {
max = min;
min = 0;
}
min = clampSafeInt(min);
max = clampSafeInt(max);
if (min > max) {
tmp = min;
min = max;
max = tmp;
}
tmp = max - min + 1;
if (tmp > Number.MAX_SAFE_INTEGER) {
throw new RangeError('Difference of max and min is greater than Number.MAX_SAFE_INTEGER: ' + tmp);
} else {
val = Math.floor(Math.random() * tmp) + min;
}
return val;
}
function stringFromPool(ary, howMany) {
var str = '';
if (Array.isArray(ary)) {
for (index = 0, howMany = Number.toInteger(howMany); index < howMany; index += 1) {
str += ary[randomInt(ary.length - 1)];
}
}
return str;
}
var getSequence = (function() {
var lower = generateChars('a', 'z'),
upper = generateChars('A', 'Z'),
digit = generateChars('0', '9'),
lowerDigit = lower.concat(digit),
upperDigit = upper.concat(digit),
all = lower.concat(upper, digit);
return function(template) {
var str = '',
index,
length,
chr;
if (isString(template) && template.length) {
for (index = 0, length = template.length; index < length; index += 1) {
chr = template.charAt(index);
switch (chr) {
case 'a':
str += stringFromPool(lower, 1);
break;
case 'A':
str += stringFromPool(upper, 1);
break;
case 'd':
str += stringFromPool(digit, 1);
break;
case 'c':
str += stringFromPool(lowerDigit, 1);
break;
case 'C':
str += stringFromPool(upperDigit, 1);
break;
case 'x':
str += stringFromPool(all, 1);
break;
default:
str += chr;
}
}
}
return str;
};
}());
function generatePattern() {
return getSequence('CCC-CCCC-CCC-CCC');
}
function runMaxTimes(fn, howMany) {
howMany = Number.toInteger(howMany);
var count = 0;
return function() {
if (count < howMany) {
count += 1;
return fn.apply(this, arguments);
}
};
}
document.getElementById('generate').addEventListener('click', runMaxTimes(function(e) {
this.textContent += generatePattern() + '\n';
}, 5).bind(document.getElementById('out')), false);
&#13;
<button id="generate">Generate</button>
<pre id="out"></pre>
&#13;
答案 2 :(得分:1)
一个非常简单的方法是创建一个包含所有要包含的字符的字符串(在您的情况下为数字和大写字母),然后使用随机数生成来选择要添加的字符串。然后,您将循环重复此过程。 。 。在适当的地方插入短划线。 。 。直到你建立了字符串。
这样的事情:
var sValidCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var sCharCode = "";
for (i = 0; i < 13; i++) {
sCharCode = sCharCode + sValidCharacters.charAt(parseInt(Math.random() * sValidCharacters.length));
if ((i === 2) || (i === 6) || (i === 9)) {
sCharCode = sCharCode + "-";
}
}
console.log(sCharCode);
这种方法的优点在于,因为它在确定随机数时使用sValidCharacters
的长度,所以您可以添加或减去来自&#34;源字符串&#34;的有效字符,而无需更改任何代码。
一些测试运行的一些示例输出:
HF1-EH46-RKP-8OL
VJ6-TRE1-DVA-WR7
156-ODA4-350-TP5
XBA-Q599-KZJ-FST
N82-DNM8-QSS-GUK
修改强>
我接受了第二次传递,使其更加灵活,因此您需要做的就是更改参数以生成您选择的代码。这是新的&#34;功能化&#34;版本:
function generateCode(sSourceCharacters, iCodeLength, sSeperator, aSeparatorPositions) {
var sNewCode = "";
for (i = 0; i < iCodeLength; i++) {
sNewCode = sNewCode + sSourceCharacters.charAt(parseInt(Math.random() * sSourceCharacters.length));
if (aSeparatorPositions.indexOf(i + 1) !== -1) {
sNewCode = sNewCode + sSeperator;
}
}
return sNewCode;
}
这样,您可以根据需要传入所需的任何参数,以生成代码。对于您的具体问题,选项将如下传递:
var charGroup = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var length = 13;
var divider = "-";
var dividerLocations = [3, 7, 10]; // the numbers indicate which character to place the divider after
var generatedCode = generateCode(charGroup, length, divider, dividerLocations);
但是,您也可以传递类似的内容:
var charGroup = "0123456789";
var length = 11;
var divider = ".";
var dividerLocations = [3, 6, 9];
。 。 。获取随机生成的IP地址(但绝不保证有效:D):示例:
235.232.608.74
125.227.649.68
983.678.369.71
605.708.890.97
537.554.201.23
或者这个,生成一个随机的,4个字母,&#34;编码的&#34;发誓说:D
var charGroup = "!@#$%^&*()?";
var length = 4;
var divider = "";
var dividerLocations = [];
结果:
@%$%
)?$&
*&(!
!^@)
*))#