2

我需要从一个数组中生成一个随机数,但排除一个索引并返回随机数的索引。
我试过这个:

function randNum(arr,excludeNum){
    var randNumber = Math.floor(Math.random()*arr.length);
    if(arr[randNumber]==excludeNum){
        randNum(arr,excludeNum);
    }else{
        return randNumber;
    }
}
alert(randNum([7, 10, 11],7));

但有时它会返回我希望它返回的数字,有时它会返回未定义的数字。
问题是什么?

4

4 回答 4

4

这是因为当生成的随机数是您要排除的随机数时,您的函数不会返回任何内容。在 if 子句中return的函数调用中添加 a 。randNum

function randNum(arr,excludeNum){
    var randNumber = Math.floor(Math.random()*arr.length);
    if(arr[randNumber]==excludeNum){
        return randNum(arr,excludeNum);
    }else{
        return randNumber;
    }
}
alert(randNum([7, 10, 11],7));
于 2013-09-29T07:18:27.010 回答
1

return前面需要一个关键字randNum(arr,excludeNum);

于 2013-09-29T07:17:25.137 回答
0

因为您正在使用 floor 并且最终堆栈会填满。(我也认为你错过了回报)

为什么不直接从数组中删除该数字并在其余部分中选择一个随机索引?

于 2013-09-29T07:20:09.930 回答
0

这是一个更新版本,它查找索引,删除不需要的索引,并从其他索引中随机选择。我用它来随机播放播放列表。

function randomIndex(arr, excludeIndex){
    let indexes = Object.keys(arr); //get a list of indexes
    indexes.splice(excludeIndex, 1); //remove the unwanted
    return indexes[Math.floor(Math.random() * indexes.length)]; //pick a new index
}
于 2021-06-04T17:47:07.707 回答