2016-07-27 2 views
1

Этот вопрос отличается от случайных букв из строки, потому что я не пытаюсь удалить что-либо из строки.Выберите случайную букву из строки в JavaScript

Я пытаюсь выбрать случайную букву из строки в JavaScript, используя Math.floor (Math.random() * string.length) и цикл while. Он должен постоянно добавлять новые случайные буквы в эту строку до указанной длины.

Мой код:

var emptyString = ""; 
var alphabet = "abcdefghijklmnopqrstuvwxyz"; 
var getRandomLetter = alphabet[Math.floor(Math.random() * alphabet.length)]; 
var randomLetter = getRandomLetter; 

while (emptyString.length < 6) { 
emptyString += randomLetter; 
emptyString ++; 
} 
console.log(emptyString); 

Проблема: На выходе же буква в 6 раз: напр. pppppp

Случайная буква генерируется из строки только один раз, а затем повторяется до указанной длины. Мне нужно, чтобы генерировать случайный вывод для каждой буквы: ex. pwezjm

Я также заметил, что если я выполню второй цикл while по строке, он будет генерировать тот же вывод, что и первый цикл: ex. pppppp

Я думал, что это будет по меньшей мере генерировать другую случайную букву, а затем первый цикл, но это не так. Почему это?

+0

Это может помочь вам: http://stackoverflow.com/a/1497512/1516112 – nikoskip

+1

Вы только генерируя одну случайную букву и не изменяя его. Почему это должно измениться? –

ответ

6

Потому что вы должны получать письмо каждый раз, но вы делаете это только один раз.

var emptyString = ""; 
var alphabet = "abcdefghijklmnopqrstuvwxyz"; 

while (emptyString.length < 6) { 
    emptyString += alphabet[Math.floor(Math.random() * alphabet.length)]; 
} 
console.log(emptyString); 

Кроме того, не уверен, что вы хотели достичь с emptyString++, удалением, что, поскольку ++ является «приращением на один» оператор, и вы не можете incremenent строки. Я думаю, что целью было иметь его в качестве счетчика для этого цикла while, но это бесполезно, поскольку счетчик уже является длиной строки.

+0

Если это используется для генерации пароля, 'Math.random()' не следует использовать, поскольку это не криптографически безопасный генератор случайных чисел. Вместо этого создайте «новый Uint32Array (6)», заполните его случайными значениями, используя 'window.crypto.getRandomValues ​​(uintArray);', а затем используйте эти числа для выбора значений из алфавита. Это немного сложнее, но миры более параноидальные. :) –

2

Получить случайный характер в loop

В вашем примере, вы получить случайный характер из массива только один раз, следовательно, нет никакого способа, вы собираетесь получить другой случайный характер в while loop

Также отметим, что emptyString++ приведет к результату, как NaN, как вы пытаетесь постинкремента string

var emptyString = ""; 
 
var alphabet = "abcdefghijklmnopqrstuvwxyz"; 
 

 
while (emptyString.length < 6) { 
 
    emptyString += alphabet[Math.floor(Math.random() * alphabet.length)]; 
 
} 
 
console.log(emptyString);

Еще один совет, alphabet.length может кэшировать вместо того, чтобы просить за него каждый раз, когда в while

+0

@PatrickRoberts - Согласен с вами ... Обновлено ... – Rayon

+1

Теперь, когда он просто дублирует мой ответ (не сказать, что это было намеренно), я не думаю, что есть необходимость в нем. – nicael

0

Вам нужно изменить getRandomLetter в функцию, и переназначить randomLetter внутри цикла, как это:

var emptyString = ""; 
 
var alphabet = "abcdefghijklmnopqrstuvwxyz"; 
 
function getRandomLetter() { 
 
    return alphabet[Math.floor(Math.random() * alphabet.length)]; 
 
} 
 
var randomLetter; 
 

 
while (emptyString.length < 6) { 
 
    randomLetter = getRandomLetter(); 
 
    emptyString += randomLetter; 
 
} 
 
console.log(emptyString);

Вы также не можете увеличивать emptyString, т.к. это строка.

1

В то время как те, что выше, хороши. Мне нравится более короткий код.

const randomLetter = ('abcdefghijklmnopqrstuvwxyz').split('')[(Math.floor(Math.random() * 26))]; 
Смежные вопросы