这个脚本的目的是打印8"块"随机生成的字母数字值由短划线分隔,以形成39个字符的唯一ID。
E7L9-XNP4-UB4K-10PU-H8IZ-C69E-3IG2-6P6W
但是,我发现这个脚本有时会返回少于39个字符的字符串,其中的块只包含2或3个字符。
21-15-18-5UD1-V471-I158-J23R-M714
如果生成的块少于4个字符,我尝试放置一个以递归方式运行blockBuilder()的条件,但这些有缺陷的ID仍会打印到页面上。
var alphabet = "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";
var alphaArray = alphabet.split(",").map(function(l) {
return l.toUpperCase()
});
function randomLetter() {
var index = Math.floor(Math.random() * 26);
return alphaArray[index];
}
function randomNumber() {
return Math.floor(Math.random() * 10);
}
function blockBuilder() {
var block = randomChar() + randomChar() + randomChar() + randomChar();
if (block.length < 4) {
blockBuilder(); //recursive check
}
return block;
}
function idBuilder() {
return blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder()
}
function randomChar() {
return Math.floor(Math.random() * 2) == 0 ? randomLetter() : randomNumber();
}
for (var i = 0; i < 100; i++) {
var v = idBuilder();
document.write(v + "<br>");
}
&#13;
我在这里缺少什么?感谢。
答案 0 :(得分:6)
这是因为您的randomNumber
函数返回数字,而不是数字。如果你连续两个,它们被加在一起,而不是连接在一起。例如,在这一行:
var block = randomChar() + randomChar() + randomChar() + randomChar();
...假设第一个调用返回2,第二个返回3,第三个返回4,第四个返回"X"
。这是:
var block = 2 + 3 + 4 + "X";
...这是"9X"
,而不是"234X"
。这将在第一次和第二次调用(至少)返回数字时发生。
转换为字符串解决了它:
function randomNumber() {
return String(Math.floor(Math.random() * 10));
}
示例:
var alphabet = "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";
var alphaArray = alphabet.split(",").map(function(l) {
return l.toUpperCase()
});
function randomLetter() {
var index = Math.floor(Math.random() * 26);
return alphaArray[index];
}
function randomNumber() {
return String(Math.floor(Math.random() * 10));
}
function blockBuilder() {
var block = randomChar() + randomChar() + randomChar() + randomChar();
if (block.length < 4) {
blockBuilder(); //recursive check
}
return block;
}
function idBuilder() {
return blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder()
}
function randomChar() {
return Math.floor(Math.random() * 2) == 0 ? randomLetter() : randomNumber()
}
for (var i = 0; i < 100; i++) {
var v = idBuilder();
document.write(v + "<br>");
}
旁注:if (block.length < 4)
是不必要的,检查不可能是真的。 (只是再次调用blockBuilder
而不对其结果做任何事情也不会有任何帮助。)
附注2:您的randomChar
函数选择一个字母或一个数字(数字),每个都有50/50的机会。这减少了你的弦乐的独特性,只有一半的时间限制在10个选择。您可以考虑执行Barmar asked about并将数字添加到整个列表中,这将使A实现更简单,并且B)在36个选项中更均匀地传播数据。
例如:
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".split("");
function blockBuilder() {
var block = randomChar() + randomChar() + randomChar() + randomChar();
return block;
}
function idBuilder() {
return blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder() + "-" + blockBuilder()
}
function randomChar() {
return chars[Math.floor(Math.random() * chars.length)];
}
for (var i = 0; i < 100; i++) {
var v = idBuilder();
document.write(v + "<br>");
}
答案 1 :(得分:1)
乍一看,在我看来,有时你只会获得数字,因此javascript引擎会将它转换为像2+1+2+9 => 14
而不是2129
这样的数字,尝试这样的代替randomChar()
功能,您甚至不需要检查长度:return Math.floor(Math.random() * 2) == 0 ? randomLetter() : randomNumber().toString();