Есть ли более быстрый способ написать эту строку - PullRequest
1 голос
/ 17 ноября 2011

Что происходит, если пользователь нажимает кнопку «Получить идентификатор сеанса». Он отображает случайную строку, которая будет представлять 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>

Ответы [ 7 ]

4 голосов
/ 17 ноября 2011
function randLetter()
{
    return String.fromCharCode(65 + Math.round(Math.random()*25));
}

...

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

Просто используйте такую ​​функцию.

http://jsfiddle.net/kgjcE/

2 голосов
/ 17 ноября 2011

Для того, что вы здесь делаете, будет гораздо дороже, чем необходимо, сгенерировать все возможные строки, а затем выбрать одну случайным образом. Если вы сделаете это таким образом, вам придется сгенерировать 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 - количество символов в строке.

Это означает, что если вы решите, что вам нужно больше идентификаторов сеансов (если больше пользователей используют ваше приложение), вы можете сделать это легко. Пятисимвольный идентификатор сеанса занял бы 11 881 376 итераций, если бы вы заранее создали все возможности. Для создания одной возможности на лету потребуется 5 итераций.

1 голос
/ 17 ноября 2011

Не храните все возможные комбинации в массиве.

Просто сгенерируйте нужные строки.

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

var rand_str = gen_str( 3 );  // "AHY"
1 голос
/ 17 ноября 2011

эта функция работает:

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;
}

, но ответ Джонатана Ньюмуиса гораздо лучше.

0 голосов
/ 17 ноября 2011

Вот небольшое улучшение / упрощение функции Джонатана:

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;
}
0 голосов
/ 17 ноября 2011

Может быть, использовать такую ​​функцию и вызывать ее три раза:

string GetCharacter(int index)
{
  switch(index)
  {
    case 1: return "A";
    case 2: return "B";
    ...
    ...
    case 27: return "Z"  
  }
} 
0 голосов
/ 17 ноября 2011

Попробуйте это

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));
        }
    }
}
...