【问题标题】:Is there a faster way to write this strings有没有更快的方法来编写这个字符串
【发布时间】:2011-11-16 23:09:10
【问题描述】:

如果用户单击“获取会话 ID”按钮,会发生什么情况。它显示一个代表 sessionId 的随机字符串。这工作正常。我的问题是,目前我有 5 个字符串,分别是“AAA”、“AAB”、“AAC”、“AAD”和“AAE”。现在我希望字符串一直持续到“ZZZ”。

写出从“AAA”到“ZZZ”的所有字符串需要我很长时间和大量的编码。我想知道的是,有没有一种方法可以显示“AAA”和“ZZZ”之间的所有字符串,而无需手动输入所有字符串?

下面是我的代码:

<head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <title>Create a Session</title>
        <script type="text/javascript">

var randomStrings = [
        "AAA",
        "AAB",
        "AAC", 
        "AAD",
        "AAE",
    ];

    function getSession() {

var randomDiv = document.getElementById("randomStrings");

          randomIndex = Math.round(Math.random()*(randomStrings.length-1));
          newText = randomStrings[randomIndex];
          randomDiv.innerHTML = newText;
}

</head>

<body>
<form action="create_session.php" method="post" name="sessionform">
 <table>
          <tr>
          <th>1: </th>
          <td><input id="sessionBtn" type="button" value="Get Session ID" name="sessionid" onClick="getSession()" /></td>   <!-- Get Session ID here-->
          <td id="randomStrings"></td>
          </tr>
          </table>
</form>
</body>

【问题讨论】:

  • 感谢大家尝试回答我的问题。我必须接受 Jonathon Newmuis 的回答,因为它非常有效。谢谢乔纳森。你真是个天才:)

标签: javascript arrays string projects


【解决方案1】:
function randLetter()
{
    return String.fromCharCode(65 + Math.round(Math.random()*25));
}

...

var newText = randLetter() + randLetter() + randLetter();

只要使用这样的函数。

http://jsfiddle.net/kgjcE/

【讨论】:

  • 你,先生,是我的新英雄 =)
【解决方案2】:

对于您在这里所做的事情,生成所有可能的字符串,然后随机选择一个,这将比必要的成本高得多。如果您这样做,您将不得不生成 17,576 (26^3) 个字符串,仅用于单个随机三字母字符串。相反,您可以只生成一个随机字符串,一次一个字符。

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" ];

function generateRandomString(strLength) {
    var output = "";
    for (var i = 0; i < strLength; i++) {
        var randomIndex = Math.floor(Math.random() * alphabet.length);
        output += alphabet[randomIndex];
    }
    return output;
}

function getSession() {
    var randomDiv = document.getElementById("randomStrings");
    newText = generateRandomString(3);
    randomDiv.innerHTML = newText;
}

此解决方案还可以更好地扩展。要生成所有可能的字符串并选择一个,您的运行时将是O(26^n),其中 n 是字符串中的字符数。此解决方案的运行时间(逐个字符构建字符串)为O(n),其中 n 是字符串中的字符数。

这意味着如果您决定需要更多会话 ID(如果有更多用户使用您的应用程序),您可以轻松完成。如果您要预先构建所有可能性,那么 5 个字符的会话 ID 将需要 11,881,376 次迭代。即时构建一种可能性需要 5 次迭代。

【讨论】:

    【解决方案3】:

    此功能有效:

    function getStrings(){
        var strings = [];
        var start = 65;
        var end = 91;
        for (var a = start; a < end; a++) {
                for (var b = start; b < end; b++) {
                        for (var c = start; c < end; c++) {
                                strings.push(String.fromCharCode(a)+String.fromCharCode(b)+String.fromCharCode(c));
                        }
                }
        }
        return strings;
    }
    

    但 Jonathan Newmuis 的回答要好得多。

    【讨论】:

      【解决方案4】:

      不要将所有可能的组合存储在一个数组中。

      只需生成你想要的字符串。

      function gen_str( len ) { 
          var str = '';
          while( len-- )
              str += String.fromCharCode( ~~(Math.random() * 26) + 65 );
          return str;
      }
      
      var rand_str = gen_str( 3 );  // "AHY"
      

      【讨论】:

        【解决方案5】:

        以下是对 Jonathan 函数的轻微增强/简化:

        var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        
        function generateRandomString(strLength) {
            var output = "";
            for (var i = 0; i < strLength; i++) {
                var randomIndex = Math.floor(Math.random() * alphabet.length);
                output += alphabet.charAt(randomIndex);
            }
            return output;
        }
        
        function getSession() {
            var randomDiv = document.getElementById("randomStrings");
            newText = generateRandomString(3);
            randomDiv.innerHTML = newText;
        }
        

        【讨论】:

          【解决方案6】:

          试试这个

          http://jsfiddle.net/snJeX/

          var strings = [];
          for (var a = 0x41; a < 0x5b; a++) {
              for (var b = 0x41; b < 0x5b; b++) {
                  for (var c = 0x41; c < 0x5b; c++) {
                      strings.push(
                          String.fromCharCode(a) +
                          String.fromCharCode(b) +
                          String.fromCharCode(c));
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2020-11-10
            • 1970-01-01
            • 2013-08-18
            • 2019-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多