生成唯一的数字

时间:2016-11-22 17:53:35

标签: javascript jquery arrays

到目前为止,我试图制作七个随机数的数组,这是我的代码:

function lotoGenerator() {
        var array = [];
        var i;
    for (i = 0; i <=6; i++) {
        var temp = Math.floor((Math.random() * 39) + 1);
        array.push(temp);
    }    
    console.log(array);
}
lotoGenerator();

现在有了这段代码,我可以得到像这样的结果[30,6,36,8,16,27,6]。 你可以看到6号出来两次。 有没有办法让数组不重复数字。 我是javaScript的新手,我无法实现我在网上找到的解决方案。

3 个答案:

答案 0 :(得分:7)

在您的随机代上放置一个do ... while语句,检查该号码是否已存在于该号码上。

function lotoGenerator() {
        var array = [];
        var i;
    for (i = 0; i <=6; i++) {
        do {
            // Generate your random number
            var temp = Math.floor((Math.random() * 39) + 1);
            // If the number already exists, the index of it on loto array will be different of -1, so it already exists
            var alreadyExists = array.indexOf(temp) !== -1;
        } while (alreadyExists) // Repeat this many times necessary to get an unique number.

        array.push(temp);
    }    
    console.log(array);
}
lotoGenerator();

请注意,这不是最有效的解决方案,因为您可能会因多次排序相同的数字而导致运气不佳,因此do...while循环可能会运行太多次。

解决此问题的最佳方法是使用包含可用数字的数组并删除绘制的数字:

function lotoGenerator() {
    var available = [];
    var drawn = [];
    for (var i = 1; i<= 40; i++) {
        available.push(i);
    }

    for (i = 0; i <=6; i++) {
        var random = Math.floor((Math.random() * available.length));
        drawn.push(available[random]);
        available.splice(random, 1);
    }

    return drawn;
}

该第二函数具有众所周知的执行时间,并且随着随机元素的数量增加将更有效。

答案 1 :(得分:3)

这是其中一个选项:

function lotoGenerator() {
    var array = [], i = 0, temp;
    while (i <= 6) {
        temp = Math.floor((Math.random() * 39) + 1);
        if ( array.indexOf(temp) > -1 ) continue;
        i = array.push(temp);
    }    
    console.log(array);
}

答案 2 :(得分:1)

添加if(array.indexOf(temp) > -1) continue;将为您的代码提供技巧。

function lotoGenerator() {
        var array = [];
    while (array.length <= 6) {
        var temp = Math.floor((Math.random() * 39) + 1);
        if(array.indexOf(temp) > -1) continue;
        array.push(temp);
    }    
    console.log(array);
}
lotoGenerator();