我正在尝试使用我在JavaScript中编写的脚本创建唯一标识符。我应用于这些标识符的约束如下:
我知道任何编程语言都不能表示真正的随机性。一些编程语言只是具有模拟“随机性”的库函数,但我认为任何语言都不会实现真正随机性的概念。不过,让我们假装JavaScript Math.random()函数是随机性的最佳实现。
这是我到目前为止的JavaScript代码:
// the numbers in this array represent the utf-8 codes for the uppercase letters A-Z
var uppercaseLetters = new Array(65,66,67,68,69,70,71,72,73,74,75,76,77,78,
79,80,81,82,83,84,85,86,87,88,89,90);
// http://stackoverflow.com/questions/16753876/javascript-button-to-pick-random-item-from-array
var randomElement = uppercaseLetters[Math.floor(Math.random() *
uppercaseLetters.length)];
document.write(String.fromCharCode(randomElement));
convertedElement = String.fromCharCode(randomElement);
// document.write("<br /> <br />");
// borrowed String.fromCharCode from some part of the Mozilla developer website
// you can also see the utf-8 character set on wikipedia:
// http://en.wikipedia.org/wiki/UTF-8
/* for(var index = 0; index < 26; index++) {
document.write(String.fromCharCode(uppercaseLetters[index]));
} */
document.write("<br /> <br />");
var result;
for(var count = 0; count < 9; count++) {
var randomNumber = Math.ceil((Math.random() * 10) - 1);
// var randomNumber = Math.ceil((Math.random() * 9)); may also work
document.write(randomNumber);
}
result += convertedElement;
document.write(result);
// http://stackoverflow.com/questions/1451009/javascript-infamous-loop-problem
/* function createDigitString() {
for(var count = 0; count < 9; count++) {
var randomNumber = Math.ceil((Math.random() * 10) - 1);
// var randomNumber = Math.ceil((Math.random() * 9)); may also work
document.write(randomNumber);
}
} */
以下是显示它的HTML:
<!DOCTYPE html>
<html>
<head>
<base href="file:///C:/Users/sillyname/" />
<script src="random-sequence.js"></script>
</head>
<body>
</body>
</html>
这两个文件显然存储在同一目录中。因此,此代码应显示“随机”9位序列,跳过几行,然后显示“随机”大写字母。现在,我想通过将字母附加到数字序列来将两者结合起来。实现这一目标的最佳(或最简单)方法是什么?
编辑:我还应该澄清一下,我想分别维护两段“随机模拟”代码。换句话说,我想将最终序列存储在变量中,同时保持可分离性:
var finalSequence = nineRandomDigits + randomUppercaseLetter
编辑:好吧,我想我有我想要的感谢所有贡献的人。这是最终的解决方案。
function randomUppercaseLetter() {
var letter = String.fromCharCode(64 + Math.ceil(Math.random() * 26));
return letter;
}
function randomNumber(len) {
var randomNumber;
var n = '';
for(var count = 0; count < len; count++) {
randomNumber = Math.ceil((Math.random() * 10) - 1);
n += randomNumber.toString();
}
return n;
}
// Usage:
var finalSequence = randomNumber(9) + randomUppercaseLetter();
document.write(finalSequence);
答案 0 :(得分:6)
此单个表达式将生成所需的ID:
var id = Array.apply(0, Array(9)).map(function() {
return String.fromCharCode(48 + Math.floor(10 * Math.random()));
}).join('') + String.fromCharCode(65 + Math.floor(26 * Math.random()));
Array.apply(0, Array(9)).map()
是一种技巧(参见here和here),用于避免显式for
循环产生前9个数字。
要稍微进行反混淆,请使用辅助函数:
function randChar(start, count) {
return String.fromCharCode(start + Math.floor(count * Math.random()));
}
function generateId() {
return Array.apply(0, Array(9)).map(function() {
return randChar(48, 10);
}).join('') + randChar(65, 26);
}
答案 1 :(得分:1)
这是我提出的最终JavaScript解决方案,也是我选择坚持的解决方案。 Alnitak提供了一个惊人的JS答案,它也执行相同的工作,但以更优雅和“神奇”的方式。如果您真的对掌握JavaScript感兴趣,我建议详细查看他的答案。
function randomUppercaseLetter() {
var letter = String.fromCharCode(64 + Math.ceil(Math.random() * 26));
return letter;
}
function randomNumber(len) {
var randomNumber;
var n = '';
for(var count = 0; count < len; count++) {
randomNumber = Math.floor(Math.random() * 10);
n += randomNumber.toString();
}
return n;
}
// Usage:
var finalSequence = randomNumber(9) + randomUppercaseLetter();
document.write(finalSequence);
为了便于测试和澄清,请使用此HTML显示结果:
<!DOCTYPE html>
<html>
<head>
<base href="file:///C:/Users/aUser/" />
<script src="random-sequence.js"></script>
</head>
<body>
</body>
</html>
我将HTML文件命名为random-sequence.html。 HTML和JS文件都存储在同一目录中。
答案 2 :(得分:0)
您可以在for之前创建一个var,并在最后添加这样的字母:
var result = "";
for(var count = 0; count < 9; count++) {
var randomNumber = Math.ceil((Math.random() * 10) - 1);
result+= randomNumber;
}
result+= randomElement;
document.write(result);