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

时间:2013-11-26 18:36:31

标签: 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}。
  3. 我知道任何编程语言都不能表示真正的随机性。一些编程语言只是具有模拟“随机性”的库函数,但我认为任何语言都不会实现真正随机性的概念。不过,让我们假装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);
    

3 个答案:

答案 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()是一种技巧(参见herehere),用于避免显式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);

修改:working jsfiddle