【问题标题】:Math.random and mixture of letters abcd etcMath.random 和字母 abcd 等的混合
【发布时间】:2016-03-15 11:32:52
【问题描述】:

我正在使用以下代码生成一个随机数:

Math.floor((Math.random() * 9999) * 7);

我得到的一些结果:

45130,
2611,
34509,
36658

我怎样才能得到这样的结果(包括 2 个字母):

TT45130,
PO2611,
KL34509,
GH36658

附加问题:

Math.random() 携带的数字范围是多少?我可以设置特定范围的值吗?没必要回答,只是好奇。

【问题讨论】:

  • Math.random() 返回 0(包括)和 1(不包括)之间的值。如果你想要其他数字,你必须自己做,就像你已经在做的那样
  • 感谢您的回复,但我不确定现在最好/正确的答案是什么...有帮助吗?

标签: javascript random


【解决方案1】:

您可以使用如下函数来获取随机大写字符:

function getRandomUppercaseChar() {
    var r = Math.floor(Math.random() * 26);
    return String.fromCharCode(65 + r);
}

所以要生成您指定的带有两个字母前缀的代码:

function generateCode() {
    var prefix = new Array(2).fill().map(() => getRandomUppercaseChar()).join(""),
        integer = Math.floor((Math.random() * 9999) * 7);
    return prefix + integer;
}

注意: 上面的generateCode 函数使用现代ES6 和ES5 javascript,这在现代环境(例如Node.js 或当前浏览器)中完全没问题。但是,如果您想要更高的兼容性(例如,确保它在旧浏览器中工作),您可以像这样重写它:

function generateCode() {
    var integer = Math.floor((Math.random() * 9999) * 7);
    for (var i = 0, prefix = ""; i < 2; ++i)
        prefix += getRandomUppercaseChar();
    return prefix + integer;
}

【讨论】:

  • 这只会生成从 A 到 Y 的上等字符,因为 Math.random() 永远不会是 1。它应该是 var r = Math.round(Math.random() * 26);还包括 Z 的可能性。
  • Math.random() 永远不可能是 1。但它可以四舍五入到 1,所以它可以工作。如果你愿意,你可以像这样测试它:for (var i = 0; i &lt; 1e3; i++) { if (Math.round(Math.random() * 25) === 25) console.log("equals 25"); }
  • 不要为此使用 Math.round()。它扭曲了概率。 Math.floor() 给出所有数字的相等概率
  • 您应该始终使用floor() 而不是round() 以确保所有结果的概率相等。所以乘以 26 对
  • 你是对的,user162097。我使用 Math.round(Math.random() * 26) 的建议是错误的,会产生诸如“[”之类的结果。 Math.floor(Math.random() * 26) 会更正确。
【解决方案2】:

尝试更简单的答案

var randomNumber = function () {
    return Math.floor((Math.random() * 9999) * 7);
}
var randomChar = function () {
    return String.fromCharCode(64 + Math.floor((Math.random() * 26)+1));
}
console.log(randomChar()+randomChar()+randomNumber());
//Sample outputs
HB10527 DR25496 IJ12394

【讨论】:

    【解决方案3】:

    或者您可以将Number#toStringradix = 36 一起用于此目的。

    function getRChar() {
        return (Math.random() * 26 + 10 | 0).toString(36).toUpperCase();
    }
    
    var s = getRChar() + getRChar() + Math.floor((Math.random() * 9999) * 7);
    
    document.write(s);

    【讨论】:

    • 这是一个聪明的做法!
    【解决方案4】:

    如果你需要用 JS 生成一个随机字符串,最常见的方法是定义一个字母表并从中选择随机索引:

    var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    var numbers = "0123456789";
    
    var randomString = "";
    
    // Pick two random chars
    for (var i = 0; i < 2; i++) {
      var rand = Math.floor(Math.random()*alphabet.length);
      randomString = randomString + alphabet.charAt(rand);
    }
    
    // Pick four random digits
    for (var i = 0; i < 4; i++) {
      var rand = Math.floor(Math.random()*numbers.length);
      randomString = randomString + numbers.charAt(rand);
    }
    
    // randomString now contains the string you want
    

    示例字符串:

    OJ8225
    YL5053
    BD7911
    ES0159
    

    【讨论】:

    • 为什么对数字使用循环?至少在我的版本中——这是一个单一的计算,而不是一个循环,每轮计算一次迭代四次。对我来说似乎不是很有效......你可以进一步简化代码如下......randomString + = numbers.charAt(rand);......不是很有效或实用......看看我有吗...我们应该互相支持,而不是破坏彼此代码中的微小缺陷。
    • 更灵活。此外,这将始终生成一个由 2 个字符和 4 个数字组成的字符串。如果你只取一个 0 到 10000 之间的随机数,你可以得到任意位数
    • fair pojnt - 但我要为我辩护说数字部分来自 OP,我的部分是字母部分,你不喜欢。但是您仍然可以做到... randomString += alphabet.charAt(rand);... 所以我的观点仍然成立。每个人的代码都有改进的潜力。对其他海报持否定态度对任何人都没有好处
    • 如果我也添加了这个我的谷歌分析跟踪代码,我会使用 var randomString 来存储随机数吗?
    【解决方案5】:

    您可以使用带有 65 到 90 之间的随机整数的 String.fromCharCode() 来获取大写字母,即

    String.fromCharCode(Math.random() * 26 + 65) + String.fromCharCode(Math.random() * 26 + 65) + Math.floor((Math.random() * 9999) * 7);
    

    给出结果:“SH21248”、“BY42401”、“TD35918”。 如果要保证字符串始终具有相同的长度,也可以使用

    String.fromCharCode(Math.random() * 26 + 65) + String.fromCharCode(Math.random() * 26 + 65) + Math.floor(Math.random() * 59993 + 10000);
    

    Math.random() 总是返回一个介于 0 和 1 之间的数字,但从不完全是 0 或 1。

    【讨论】:

      【解决方案6】:

      一个字母数组,生成一个随机数以获得一个随机字母,重复以获得第二个随机字母,然后加入到您的代码中生成的随机数:

      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 ranletter1 = alphabet[Math.floor(Math.random() * alphabet.length)];
      var ranletter2 = alphabet[Math.floor(Math.random() * alphabet.length)];
      var ranNum = Math.floor((Math.random() * 9999) * 7);
      
      var ranCode = ranletter1 + ranletter2+ ranNum;
      

      【讨论】:

      • 代码不是很好维护也不是易于阅读。为什么不直接询问字母的长度,而不是硬编码 26?
      • 谢谢 - 实际上它只有 26 个 - 有两个“G”而没有“H”......但现在都修复了,而且很难阅读 - 一个字母数组和 3 个数学随机实例!
      • 字母数组写起来太复杂了。为什么不只是一个字符串?
      • @Suppen - 同一端的不同方式 ['R','E','S','U','L','T'] 和 alphabet.length 更多字符而不是编码超过 26... 除非我弄错了,否则长度不太可能改变,所以为什么还要查询已知数量
      • 在这种情况下,不是很重要。然而,在较大的程序中,没有解释的文字或 cmets 变得非常混乱。还有,为什么不能改?如果提问者认为 O 和 0 看起来太相似,并且不希望代码生成 O 怎么办?这需要三个编辑:一个从数组中删除它,两个编辑两个 26es。如果 26 出现在代码的其他地方怎么办?很容易忘记更改它,或者很容易更改不是指字母长度的 26。搜索和替换太方便了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多