for循环,Math.random()没有按预期运行

时间:2015-02-01 16:17:47

标签: javascript arrays loops

我正在尝试用javascript编写骰子游戏,使用Math.random()生成骰子的值和一个数组来保存每个骰子的当前值。

我遇到的问题是1),数组最后包含6个数字,循环只运行5次,2)我无法弄清楚如何让Math.random()返回不同的数字在每个骰子上。

这是有问题的功能:

var array = []

function rollDice() {
    for (var i = 0; i <= 4; i++) {

        var roll = Math.floor(Math.random() * 6) + 1;

        array[i] = roll;
        //array.splice(i, 1, roll);
    }
}

你可以看到'i'在循环中从零迭代到4(等于五个循环),并且在每个循环上生成另一个随机数并将其插入到等效位置的数组中。

关于数组中的项目数:如果我运行上面写的代码,我会得到这样的东西:[1,2,3,4,5,undefined]。 如果我使用带有'splice'函数的注释行运行它(它应该删除存储在'i'处的值并用新值替换它),我会得到[1,2,3,4,5, 6]。如果循环只运行五次,这是怎么回事?

至于难以让我更随机地更改随机数:我在循环中尝试了以下内容......

var roll;
while (roll === hand[i] || roll === null) {
    roll = Math.floor(Math.random() * 6) + 1;
}

...希望'roll'能够保持随机数旋转,直到它出现不同的数字,但没有骰子。有没有人有任何建议?

编辑:我添加了一个显式数组声明,因为我没有说清楚我的数组实际上是在之前显式声明的。

3 个答案:

答案 0 :(得分:1)

我按照你的意图运作了。

代码中的错误:

  1. array未定义声明在外
  2. 您正在undefined变量上定义属性。
  3. 你使用while循环非常糟糕。
  4. 你的函数没有返回任何内容。因为它在外面声明,所以这是一个不需要的(正确的)点。
  5. 以下是使用for的代码:

    function rollDice() {
        for (var i = 0, array = []; i <= 4; i++)
        {
            array[array.length] = Math.floor(Math.random() * 6) + 1;
        }
        return array;
    }
    

    的变化:

    1. 删除了无用的roll变量。
    2. 使用属性length设置下一个位置(类似于array.push(value)更快)。
    3. 宣布缺少array
    4. 返回值
    5. 使用do ... while循环:

      function rollDice() {
          var array = [];
          do
          {
              array[array.length] = Math.floor(Math.random() * 6) + 1;
          }
          while ( array.length < 5 );
          return array;
      }
      

      的差异:

      1. 不再需要变量i
      2. 直接声明和增加array.length
      3. 你只检查最后的长度,这是一个没用的检查
      4. 更快 !!!
      5. 关于编辑:

        不要这样做!

        不要访问在外部函数声明的变量。

        这是最容易出错的方式!

答案 1 :(得分:0)

随机返回1到5之间的5个唯一数字:

var array = [1,2,3,4,5]

function rollDice() {
    array.sort(function(){
        return Math.random() - 0.5;
    });
}

小提琴:http://jsfiddle.net/1wrgrr0v/1/

答案 2 :(得分:0)

现在您已经澄清了您想要的是,对roll()的连续调用不会重复数组中该特定插槽中的值,您可以这样做:

function rollDice() {
    var roll;
    for (var i = 0; i <= 4; i++) {
        // keep generate a new random value until it is different
        // than what was in this slot of the array before
        while ((roll = Math.floor(Math.random() * 6) + 1) === array[i]) {}
        array[i] = roll;
    }
}

工作演示:http://jsfiddle.net/jfriend00/frh3dyvd/