for loop, Math.random() 不按预期运行

for loop, Math.random() not acting as intended

本文关键字:运行 loop Math random for      更新时间:2023-09-26

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

我遇到的问题是 1),数组最终包含六个数字,循环只运行五次,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"在循环中从零迭代到四(等于五个循环),并且在每个循环中生成另一个随机数并将其插入到数组的等效位置。

关于数组中的项目数:如果我按照上面写的代码运行,我会得到这样的结果:[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;
}

。希望"掷"会继续旋转随机数,直到它想出一个不同的数字,但没有骰子。有人有什么建议吗?

编辑:我添加了一个显式数组声明,因为我没有足够清楚地表明我的数组实际上是显式声明的。

我让它按照你的意图工作。

代码中的错误:

  1. array未定义 它在外部声明
  2. 您正在定义undefined变量的属性。
  3. 您错误地使用了while循环。
  4. 您的函数不返回任何内容。 (由于数组是在循环外部声明的,因此这是一个不必要的点。

以下是使用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. 返回要在函数外部分配的值

使用 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. 更快!!

关于(琐碎的)编辑:

别这样!!!

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

这是最容易出错的方法!

要随机返回 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/

既然您已经阐明了您想要的是对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/