首页 > 解决方案 > 从源数字数组中提取随机数的最佳方法是什么,直到源数组中没有唯一值?

问题描述

我需要创建一个 makeRandom 函数,它接受一系列数字作为数组,其中第一个数字是范围的开始,第二个是结束,包括该范围内的这个数字。这个函数的结果应该是一个函数,并且调用从范围内返回一个随机数。返回的数字必须是唯一的。如果我用完了唯一编号,则必须返回 null。

它应该像这样工作:

const getRandom = makeRandom([1, 5]);
getRandom() === 3
getRandom() === 4
getRandom() === 5
getRandom() === 2
getRandom() === 1
getRandom() === null
getRandom() === null

所以我尝试了:

function makeRandom(numbers) {
  return () => {
    let randNumber = Math.floor(Math.random() * numbers.length);

    for (let i = 0; i < numbers.length; i++) {
      randNumber += numbers[i];

      if (randNumber === numbers[i]) {
        return true;
      }

      if (randNumber === numers[i].length) {
        return true;
      }
    }

    if (!numbers) {
      return null;
    }
  };
}

但它不起作用。那么最好的方法是什么?

标签: javascriptrandomclosures

解决方案


如果数组有长度或返回,您可以添加数组中的所有值并拼接数组null

const
    makeRandom = ([min, max]) => {
        const values = [];
        while (min <= max) values.push(min++);
        return () => values.length
            ? values.splice(Math.floor(Math.random() * values.length), 1)[0]
            : null;
    },
    getRandom = makeRandom([1, 5]);

console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());
console.log(getRandom());


推荐阅读