2016-07-27 154 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

隨機字母被從字符串僅生成一次,然後重複,直到指定的長度。我需要它爲每個字母生成隨機輸出:例如。 pwezjm

我也注意到,如果我做了第二個不同,而環比弦,它就會產生相同的輸出作爲第一個循環:恩。 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()',因爲它不是一個密碼安全的隨機數生成器。相反,創建一個'new 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))];