【问题标题】:I need to make an array of 15 random integers. I have a function but dont want numbers to repeat我需要制作一个由 15 个随机整数组成的数组。我有一个功能,但不希望数字重复
【发布时间】:2018-02-04 15:13:10
【问题描述】:

我正在为学校做一个项目。我需要在 1 和 50 之间生成 15 个随机整数的数组。我有一个函数,但我不希望数字重复。 (例如,如果数字 3 位于索引 0 处,我不希望它再次出现在数组中。)如果我能得到一些关于不重复数字的帮助,那就太好了。

感谢您的帮助!

var arr;

function genArray() {
    //generates random array
    arr = [];
    for (var i = 0; i < 15; i++) {
        var min = 1;
        var max = 50;
        var arrayValue = Math.floor(Math.random() * (max - min + 1)) + min;
        arr.push(arrayValue);
    }
    arr.sort(function(a, b) {
        return a - b
    });
    console.log(arr);
}

【问题讨论】:

标签: javascript arrays random repeat


【解决方案1】:

在循环中生成一个新的随机数,而该数在数组中。换句话说,只有当新数字不在数组中时才继续。

var arr;

function genArray() {
  //generates random array
  arr = [];
  for (var i = 0; i < 15; i++) {
    var min = 1;
    var max = 50;
    do
    {
      var arrayValue = Math.floor(Math.random() * (max - min + 1)) + min;
    }while(arr.includes(arrayValue))
    arr.push(arrayValue);
  }
  arr.sort(function(a, b) {
    return a - b
  });
  console.log(arr);
}

genArray();

【讨论】:

    【解决方案2】:

    您可以创建一个函数来检查数字是否已经在数组中,而不是重新生成数字,否则将数字推送到数组中

    var arr;
    
        function genArray() {
          //generates random array
          arr = [];
          for (var i = 0; i < 15; i++) {
            var min = 1;
            var max = 50;
            var arrayValue = Math.floor(Math.random() * max) + min;
            if(checkno(arrayValue)==true)
               arr.push(arrayValue);
          } 
          arr.sort(function(a, b) {
            return a - b
          });
          console.log(arr);
        }
    
        function checkno(var no)
        {
        for(var i=0;i<arr.length;i++)
            {
               if(arr[i]==no)
                  return false;
               else
                  return true;
            }
        }
    

    【讨论】:

      【解决方案3】:

      另一种解决方案涉及Set object,集合只有唯一元素,相同值的多个元素被忽略。

      为此用途实现的集合对象示例:

      var temp = new Set();
      while (temp.size < 15) {
        var min = 1;
        var max = 50;
        temp.add(Math.floor(Math.random()*(max-min+1))+min);
      }

      【讨论】:

        【解决方案4】:

        这种方法使用箭头函数,forEachincludes 函数。

        let LENGTH = 15;
        let numbers = new Array(LENGTH).fill();
        
        let findRandomNumber = (i) => {
          let rn;
          while (numbers.includes((rn = Math.floor(Math.random() * 50) + 1))) {}
          numbers[i] = rn;
        };
        
        numbers.forEach((_, i) => findRandomNumber(i));
        console.log(numbers.sort((a, b) => a - b));
        .as-console-wrapper {
          max-height: 100% !important
        }

        【讨论】:

          【解决方案5】:

          您无需检查结果数组并重新生成数字。效率不高。
          请看下面的sn-p:

          function get_N_rand(N = 15, min = 1, max = 50) { // set default values
            var N_rand = [], range = [];
            for (var i = min; i <= max;) range.push(i++); // make array [min..max]
            while (N_rand.length < N) { // cut element from [min..max] and put it into result
              var rand_idx = ~~(Math.random() * range.length);
              N_rand.push(range.splice(rand_idx, 1)[0]);
            }
            return N_rand;
          }
          
          console.log(JSON.stringify( get_N_rand() )); // run with defaults
          console.log(JSON.stringify( get_N_rand(6, 10, 80) )); // run with arbitraries

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-02-10
            • 2018-04-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-23
            • 1970-01-01
            • 2018-08-23
            相关资源
            最近更新 更多