2013-04-18 60 views
3

我想創建一個4個字母的長字符串,RANDOMLY包含字符串中的任何字母:「ROYGBV」。靈活使用Math.random

我所做的一切是這樣的:

function generateSolution(){ 
    var colors = "ROYGBV"; 
    var str = ""; 
    for (var i=0; i<4; i++) { 
     var loc = Math.ceil(Math.random()*colors.length); 
     str += colors.charAt(loc); 
    } 

    return str; 
} 

但這似乎不正確的,這是爲什麼?

也,這是從鍛鍊的解決方案:

str += colors.charAt((Math.random() * 6) | 0); 

我使用Math.ceil在我的解決方案,以防止randoming花車像4.333123等。這個解決方案如何工作,而不是將隨機數字四捨五入?

另外,運營商|是什麼意思?以及第二種解決方案中的隨機化實際上如何工作?

+0

缺少靛藍? –

+0

@frrlod:一旦你收到答案,你爲什麼這麼改變你的問題? – Matt

+0

我想強調問題的第二部分,但你是對的。感謝您的編輯。 – frrlod

回答

4

|bitwise OR operator。由於在JavaScript位運算只有32位整數的工作,這是對0在你的情況四捨五入AA號碼的簡寫方式是相同的:需要被難倒,而不是圍捕

colors.charAt(Math.floor((Math.random() * 6))); 

數量,因爲您目前正在使用ceil,或者您將錯過數組的第一個元素(索引爲0)。

這裏的轉化爲整數的全部細節由the spec

生產A:@ B,其中@是在上述製作的位運算符之一,如下評價:

  1. lref是評估結果A
  2. lval成爲GetValue(lref)。
  3. rref是評估結果B
  4. rval成爲GetValue(rref)。
  5. lnum bent32(lval)。
  6. rnum bent32(rval)。
  7. 返回將運算符@應用於lnum和rnum的結果。結果是一個有符號的32位整數。
+0

'|'不是地板的簡寫形式,它是圓形趨近於零的簡寫形式,NaN和無窮大 - > 0。 –

+0

@MikeSamuel - 非常好,謝謝。編輯。 –

+0

對不起,這完全回答了我的問題。 – frrlod

1

你想要Math.floor()而不是Math.ceil()。 Javascript陣列是基於零的,所以你需要0到5之間的值。

1

試試這個

function generateSolution() { 
    var colors = "ROYGBV", 
     str = "", 
     l = colors.length, 
     i = 0; 

    while (i < 4) { 
     var loc = Math.floor(Math.random() * l); 
     str += colors.charAt(loc); 

     i += 1; 
    } 

    return str; 
} 

console.log(generateSolution()); 

jsiddle

你需要Math.floor,該|只是一個按位方法執行32位地板