生成无重复的随机元素

时间:2018-11-24 16:45:01

标签: javascript random

我正在尝试制作一个随机数生成器

我编写了代码,并且效果很好。

document.querySelector('#btn').addEventListener('click',()=>{
  generate(1,45,6)
});

function generate(min, max, count){
  const arr = [];

  if(min >= max) return;
  if(max - min + 1 < count) return;

  while (arr.length < count) {
    let num = Math.floor(Math.random() * max) + min;
    let flag = arr.every((i) => {
      return i === num ? false : true;
    });
    if (flag) {
      arr.push(num);
    }
  }
  console.log(arr);
}
<button id="btn">Gen</button>

但是我算法的时间复杂度是 O(n)。 (我不确定,我没有严格计算)

我希望能减少时间的复杂性。

而且,我想上面的代码可以压缩,但我不能压缩。

我想要的摘要

  1. 要尽可能减少时间复杂度

  2. 使其紧凑

1 个答案:

答案 0 :(得分:2)

您可以使用Set(它将处理重复项)代替数组,并继续检查其大小,直到获得所需的所有数字为止:

document.querySelector('#btn').addEventListener('click',()=>{
  generate(1,45,6)
});

function generate(min, max, count){
  const s = new Set();

  if(min >= max) return;
  if(max - min + 1 < count) return;

  while (s.size < count) { // O(1)
    let num = Math.floor(Math.random() * max) + min;
    s.add(num); // O(1)
  }
  console.log(Array.from(s));
}
<button id="btn">Gen</button>