开发者问题收集

Javascript 随机数组检查错误

2015-07-23
53

正在开发一款游戏,但搞不清楚为什么我的函数无法正常工作。

Uncaught RangeError: Maximum call stack size exceeded

据我所知,我的一个函数有一个无限循环(?)

我有一个数组,里面需要有 3 个随机速度。

var randomSpeeds = new Array();

我有一个函数可以生成随机速度:

function generateSpeed() {
    var randomSpeed = Math.random().toFixed(1) * 5;
    if(randomSpeed == 0){
        randomSpeed = 1;
    }
    return randomSpeed;
}

该数组由此函数填充:

function fillSpeedArray() {
    for(var i = 0; i < 3; i++) {
        var randomSpeed = generateSpeed();
        if(speedArrayChecker(randomSpeed) != false) {
            randomSpeeds.splice(i, 0, randomSpeed);
        } else {
            fillSpeedArray();
        }
    }   
}

该函数循环 3 次,每次生成一个随机速度并通过 if/else 语句检查数组是否已经有随机生成的数字 (speedArrayChecker)。

speedArrayChecker:

function speedArrayChecker(speed) {
    for(speeds in randomSpeeds) {
        if(speeds != speed) {
            return true;
        }
    }
    return false;
}

最后一个函数遍历数组,如果数组已经有随机生成的数字,返回 true,否则返回 false。

函数调用和检查:

fillSpeedArray();
console.log(randomSpeeds);

由于某种原因,我看不出这些函数没有正常工作。 谢谢并致以问候。

2个回答

解决方案:

var randomSpeeds = new Array();
function generateSpeed() {
    var randomSpeed = Math.random().toFixed(1) * 5;
    if(randomSpeed == 0){
        randomSpeed = 1;
    }
    return randomSpeed;
}
function fillSpeedArray() {   
    while (randomSpeeds.length < 3) {
        var randomSpeed = generateSpeed(); 
        if (speedArrayChecker(randomSpeed) != false) {
            randomSpeeds.splice(randomSpeeds.length, 0, randomSpeed);
        }
    }
}
function speedArrayChecker(speed) {
    return randomSpeeds.indexOf(speed) === -1
}
fillSpeedArray();
console.log(randomSpeeds);

解释:

您的代码有两个问题。

  1. speedArrayChecker 函数的实现存在根本缺陷。它仅在 randomSpeeds 为空时才返回 false
  2. 您遇到了由无限递归导致的无限循环。

解决方案是更正 speedArrayChecker 实现并使用 while 循环而不是 for 循环。

Alex Booker
2015-07-23

这里有一个无限循环(通过递归):

function fillSpeedArray() {
 for(var i = 0; i < 3; i++) {
        var randomSpeed = generateSpeed();
        if(speedArrayChecker(randomSpeed) != false) {
            randomSpeeds.splice(i, 0, randomSpeed);
        } else {
            fillSpeedArray();
        }
    }   
}

else 中,如果速度已经存在,它将一次又一次地调用当前所在的函数。除非您第一次就完美地获得 3 个随机速度,否则该函数永远不会退出。我建议将 fillSpeedArray() 更改为 i--

顺便说一句,为什么不使用 randomSpeeds.push(randomSpeed) 将速度添加到数组中呢?

depperm
2015-07-23