生成随机数字序列,然后在JavaScript中为该序列附加大写字母?

brt*_*mps 1 javascript random utf-8 sequence

我正在尝试使用JavaScript编写的脚本创建唯一标识符.我应用于这些标识符的约束如下:

  1. 标识符的前九个字符必须是随机的数字序列.我定义 '数字' 作为设置在{0,1,2,3,4,5,6,7,8,9}.
  2. 每个标识符的最后一个字符必须是随机的单个英文大写字母.我在{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}.

我知道任何编程语言都不能表示真正的随机性.有些编程语言只是有一个库函数模拟"随机性",但我不认为任何语言实际上,实现了真正的随机性的想法.不过,让我们假装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);
    } 
} */
Run Code Online (Sandbox Code Playgroud)

以下是显示它的HTML:

<!DOCTYPE html>
<html>
<head>
    <base href="file:///C:/Users/sillyname/" /> 
    <script src="random-sequence.js"></script>
</head>

<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

这两个文件显然存储在同一目录中.因此,此代码应显示"随机" 9位数的序列,跳过几行,然后显示一个"随机"大写字母.现在,我想通过将字母附加到数字序列来将两者结合起来.实现这一目标的最佳(或最简单)方法是什么?

编辑:我还应该澄清,我想分别维护两个"随机模拟"代码.换句话说,我想将最终序列存储在变量中,同时保持可分性:

var finalSequence = nineRandomDigits + randomUppercaseLetter
Run Code Online (Sandbox Code Playgroud)

编辑:好吧,我想我有我想要的感谢所有贡献的人.这是最终的解决方案.

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);
Run Code Online (Sandbox Code Playgroud)

Aln*_*tak 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()));
Run Code Online (Sandbox Code Playgroud)

Array.apply(0, Array(9)).map()是一个技巧(见这里,这里),用于避免显式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);
}
Run Code Online (Sandbox Code Playgroud)