灵活地使用Math.random

时间:2013-04-18 14:50:45

标签: javascript string random operators

我想创建一个4个字母的长字符串,RANDOMLY包含字符串中的任何字母:" ROYGBV"。

我所做的是:

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来防止像4.333123这样的随机浮动等等。这个解决方案如何工作,而不会使得数字变得圆滑?

此外,|运算符是什么意思?以及第二种解决方案中的随机化如何实际起作用?

3 个答案:

答案 0 :(得分:4)

|bitwise OR operator。由于JavaScript中的按位运算仅适用于32位整数,因此这是将数字四舍五入为0的简便方法。在您的情况下,它等同于:

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

的数量需要被地板而不是舍入,因为你当前与做ceil,否则会错过阵列(其在索引0)的第一要素。

以下是从the spec转换为整数的完整详细信息:

  

生产A:A @ B,其中@是上述产品中的一个按位运算符,评估如下:

     
      
  1. lref 成为评估 A 的结果。
  2.   
  3. lval 为GetValue( lref )。
  4.   
  5. rref 成为评估 B 的结果。
  6.   
  7. rval 为GetValue( rref )。
  8.   
  9. lnum 为ToInt32( lval )。
  10.   
  11. rnum 为ToInt32( rval )。
  12.   
  13. 返回将按位运算符@应用于lnum和rnum的结果。结果是带符号的32位整数。
  14.   

答案 1 :(得分:1)

您希望Math.floor()代替Math.ceil()。 Javascript数组从零开始,因此您需要0到5之间的值。

答案 2 :(得分: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位底层的一种按位方法