检查随机数是否在数组中,如果为true则再次随机化?

时间:2014-09-26 11:34:37

标签: javascript

我正在创建一个战舰游戏,我试图将计算机的船随机化。但是,它有时会不止一次地将同一位置随机化,因此在某些轮次中创建的船只少于8艘。我尝试使用indexOf修复此问题,但无论我如何更改代码,我似乎无法使其工作。如果随机数在数组shipLocations中,那么我想再次重新编号,直到它是一个与数组中任何数字都不匹配的数字。有什么想法吗?

var shipLocations = [];

function randShips() {

    for (i = 0; i < 8; i++) {

        var randomize = Math.floor(Math.random() * 64 + 1);

    if (shipLocations.indexOf(randomize) == true) {
        var randomize = Math.floor(Math.random() * 64 + 1);
    }

    else {
        shipLocations.push(randomize);    
    }

    } //end of i loop

} //end of randShips()

randShips();
console.log(shipLocations);

编辑:因此,在尝试了一些答案之后,这似乎在测试大约100次之后应该是这样的。

var shipLocations = [];

function randShips() {

while (shipLocations.length < 8) {

    var randomize = Math.floor(Math.random() * 64 + 1);

    while (shipLocations.indexOf(randomize) > -1) {
        randomize = Math.floor(Math.random() * 64 + 1);
    }

    shipLocations.push(randomize);
}
}

randShips();

4 个答案:

答案 0 :(得分:0)

indexOf不返回布尔值,它返回匹配元素的索引(int)。

所以代码应该是

if (~shipLocations.indexOf(randomize)) {
    var randomize = Math.floor(Math.random() * 64 + 1);
}

您可以使用此函数获取阵列的真正唯一编号。

function uniqueRandom( arr) {
    var num = Math.floor(Math.random() * 64 + 1);
    if (~arr.indexOf(num)) {
        uniqueRandom(arr);
    } else {
        return num;
    }
}
不过,你写的逻辑有问题。如果找到重复的数字,则只需将其重新随机化,而不将其推入数组。所以使用while或递归函数应该可以很好地完成这项工作。

答案 1 :(得分:0)

var shipLocations = [];

function randShips() {

    while ( shipLocations.length < 8 ) {
        var randomize = Math.floor(Math.random() * 64 + 1);
        while ( shipLocations.indexOf(randomize) >= 0 ) {
            randomize = Math.floor(Math.random() * 64 + 1);            
        }
        shipLocations.push(randomize);
    }

} //end of randShips()

randShips();
console.log(shipLocations);

答案 2 :(得分:0)

由于您需要8个唯一值,因此连续创建的2个数字很可能都在数组中。所以我想你会想做一个while

while (shipLocations.indexOf(randomize) != -1) {
    randomize = Math.floor(Math.random() * 64 + 1);
}

var部分不应该存在,这只是变量的第一个实例所必需的。

答案 3 :(得分:0)

在javascript中,返回值为 -1 的错误条件。

因此,将 if-else 条件更改为:

if (shipLocations.indexOf(randomize) != -1) { //true condition equivalent
    var randomize = Math.floor(Math.random() * 64 + 1);
}

else {
    shipLocations.push(randomize);    
}