3

我想创建一个 4 字母长的字符串,随机包含字符串中的任何字母:“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 等随机浮点数。如果不对随机数进行四舍五入,此解决方案如何工作?

另外,|运营商是什么意思?第二个解决方案中的随机化实际上是如何工作的?

4

3 回答 3

4

|位或运算符。由于 JavaScript 中的按位运算仅适用于 32 位整数,因此这是将 aa 数舍入为 0 的简写方式。在您的情况下,它相当于:

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

该数字需要被取整而不是向上取整,就像您当前正在使用的那样ceil,否则您将错过数组的第一个元素(位于索引 0 处)。

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

产生式 A : A @ B,其中 @ 是上述产生式中的位运算符之一,计算如下:

  1. lref为评估A的结果。
  2. lval为 GetValue( lref )。
  3. rref为评估B的结果。
  4. rval为 GetValue( rref )。
  5. lnum为 ToInt32( lval )。
  6. rnum为 ToInt32( rval )。
  7. 返回将按位运算符 @ 应用于 lnum 和 rnum 的结果。结果是一个带符号的 32 位整数。
于 2013-04-18T14:55:34.547 回答
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 位地板的按位方法

于 2013-04-18T14:57:29.543 回答
1

你想要Math.floor()而不是Math.ceil(). Javascript 数组是从零开始的,因此您需要介于 0 和 5 之间的值。

于 2013-04-18T14:54:35.027 回答