【问题标题】:Generate a 4 digit array with unrepeated numbers in it生成一个包含不重复数字的 4 位数组
【发布时间】:2014-07-13 12:04:06
【问题描述】:
var globalScope = {}


function generateNum() {
    globalScope.genNum = [];
    for (var i = 0; i < 4; i++) {
        var numEl = Math.floor((Math.random() * 9)+1);
        globalScope.genNum.push(numEl);
    }
    return globalScope.genNum;
}

大家好。我刚刚开始学习 JS,我的硬件是创建一个 4 位数组,其中包含从 1 到 9 的不重复数字(用于公牛和奶牛游戏)。但我不知道如何实现检查这个数组是否有重复的数字。有人请帮忙。提前致谢

【问题讨论】:

  • 一种方法是创建一个从 0 到 9 的数字数组,然后从其中随机创建 splice 4 个成员。这样你就可以得到不重复的随机数字。

标签: javascript arrays


【解决方案1】:

或者,您可以使用包含从 09 的所有数字的源数组,并且每次从源中选择并删除其中一个:

function genNum(){
    var arr = [], // target array
        source = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0], // source array
        sourceLen = source.length,
        i, r;

    for (i=0; i<4; i++) {
        r = Math.floor(Math.random()*(sourceLen-i)); // pick a random index
        // remove it from the source and add it to the target
        arr.push(source.splice(r, 1)[0]);
    }

    // return it
    return arr;
}

MDN 上阅读有关.splice 方法的更多信息。

【讨论】:

  • 谢谢。它帮助很大。
【解决方案2】:

最好的方法是拥有一个包含所有数字的数组,然后从中提取数字:

var allDigits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    result = [];
for (var i = 0; i < 4; i++) {
    result[i] = allDigits.splice(Math.floor((Math.random() * allDigits.length) + 1, 1);
}
return result;

【讨论】:

  • 我很好奇,有趣的是,使用 [] 分配而不是 push 快​​ 10 倍以上(参见 benchmark)。
  • 有道理,[i] 只写一次,.push() 读一次写一次。而且数组越大,读取时间越长。 (这只是一个有根据的猜测,我不知道它实际上是如何工作的)。
【解决方案3】:

好的,从初学者的角度来看,您要做的第一件事就是思考您需​​要采取哪些步骤来做到这一点。

伪码

1, Generate random number.
2, Place random number in array.
3, Loop until array length = 4:
4,    Generate random number.
5,    Check if number is in array already.
6,    If number isn't in array already then add it.

这使得创建代码变得非常容易,您首先需要生成一个随机数,然后将其 .push 到一个数组中。然后使用while循环直到array.length === 4。在此循环中生成更多数字,然后使用for loop 检查该数字是否已存在于数组中,

for(var i = 0; i < array.length; i++){
   //Check here
}

【讨论】:

    【解决方案4】:
    var globalScope = {}
    
    
    function generateNum() {
        globalScope.genNum = [];
        while (globalScope.genNum.length < 4) {
            var numEl = Math.floor((Math.random() * 9) + 1);
            if (globalScope.genNum.indexOf(numEl) < 0) {
                globalScope.genNum.push(numEl);
            }
        }
        return globalScope.genNum;  
    }
    

    【讨论】:

    • 这是在 O(n^2) 中,而在 O(n) 中有一个解决方案涉及另一个数组。
    【解决方案5】:

    这个函数本质上就是你要找的(我猜):

    • 首先,在[0,10-i)范围内随机选择一个index
    • 然后,将条目#index 处的数字添加到输出数组中
    • 最后,将条目#i 的数字复制到条目#index

    function generateNum()
    {
        var digits = [0,1,2,3,4,5,6,7,8,9];
        var output = [];
        for (var i=0; i<4; i++)
        {
            var index = Math.floor(Math.random()*(10-i));
            output += digits[index];
            digits[index] = digits[10-i];
        }
        return output;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 1970-01-01
      • 2017-12-19
      • 2014-03-23
      • 2023-04-07
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多