如何在Javascript中从一个范围中随机选择多个不同的整数?

如何在Javascript中从一个范围中随机选择多个不同的整数?,javascript,Javascript,如何编写这样的函数:select_fromn,min,max,它随机选择n个不同的整数,范围从mininclude到maxexcluded 当我搜索时,所有答案都是为了从数组/范围中选择一个项目/编号,而不是多个项目。我目前可以想到的一种方法是创建一个从最小值到最大值的整数数组。然后从该数组中重复选择项目,同时在每次选择后删除所选项目: function select_from(n, min, max) { var range = []; var result = [];

如何编写这样的函数:select_fromn,min,max,它随机选择n个不同的整数,范围从mininclude到maxexcluded

当我搜索时,所有答案都是为了从数组/范围中选择一个项目/编号,而不是多个项目。我目前可以想到的一种方法是创建一个从最小值到最大值的整数数组。然后从该数组中重复选择项目,同时在每次选择后删除所选项目:

function select_from(n, min, max) {
    var range = [];
    var result = [];

    for (var i = min; i < max; i++) {
        range.push(i);
    }

    for (var j = 1; j <= n; j++) {
        var select = Math.floor(Math.random()*range.length);
        result.push(range[select]);
        range = range.splice(select, 1);
    }

    return result;
}

有什么有效的方法吗?谢谢大家!

像这样修改第二个for循环

for (var j = 1; j <= n; j++) {
    var select = Math.floor(Math.random()*range.length);

    if (result.indexOf(range[select]) === -1)
        result.push(range[select]);
}
return result;

不初始化整数数组而是初始化随机范围如何

从n、min、max中选择函数{ var结果=[]; 对于变量i=0;iconsole.lognumbers一种替代方法,但我不知道相对性能的影响,就是使用拼接: 这意味着您可以保持for循环,但会不断改变范围数组:

从n、min、max中选择函数{ var范围=[]; var结果=[]; 对于变量i=min;i从10,1,11中选择_那么foo呢?您从哪个数组中选择它们?您的范围是空数组,因此您的代码是空的broken@YosvelQuintero对不起,输入错误。@Dummy我已经更正了我的文本。@XiaojunChen看到我的答案了,因此结果的长度可能小于n。同时,这个算法在^2上,我指的是总时间。考虑到总时间,这是真的,我明白了。但在代码中,如果条件result.indexOfrange[select]=-1为false,则不会向结果中添加任何项。所以for循环应该改为while并停止,直到结果的长度为n?这意味着我不知道实际发生了多少次循环。虽然循环很好,但在这个for循环的情况下,如果条件为false,它将继续进行下一次迭代,当j等于n时,它将最后一次循环,因为你的循环有j,我的意思是,在n次迭代之后,结果的长度可能小于n个不同的整数,从中间的列表中删除一个元素是非常昂贵的。operation@Dummy也许吧,但它可以和其他人相比;与检查该值是否已被使用相比,我不知道任何相对时间成本。就时间复杂度而言,如果我们不太在意,您的解决方案将继续运行splice@Dummy我每次洗牌的时候,拿最后一个,把它移除。虽然我也不知道代价。@XiaojunChen你仍然会付出同样的代价,因为你在该算法的每次迭代中都会洗牌源数组