2013-04-18 54 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位地板