@Tarass_88

Как получать случайные уникальные числа из заданного интервала?

Надо создать функцию makeRandomizer, которая принимает диапазон чисел в виде массива, где первое число - начало диапазона, а второе - конец включая это число в диапазон. Результатом этой функции должна быть функция, вызов которой возвращает случайное число из указанного диапазона. Числа, которые возвращаются, должны быть уникальными. Если уникальные числа закончились, вернуть null.

Пример:

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

Вот что я сделал, но думаю, что ошибочно:

function makeRandomizer(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;
    }
  };

}
  • Вопрос задан
  • 912 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Создать массив, выдёргивать случайный элемент:

function makeRandomizer([ min, max ]) {
  const numbers = [...Array(max - min + 1).keys()];

  return () => numbers.length
    ? min + numbers.splice(Math.random() * numbers.length | 0, 1)[0]
    : null;
}

Создать массив, перемешать его, доставать последний элемент:

function makeRandomizer([ min, max ]) {
  const numbers = Array.from({ length: max - min + 1 }, (n, i) => min + i);

  for (let i = numbers.length; --i > 0;) {
    const j = Math.random() * (i + 1) | 0;
    [ numbers[i], numbers[j] ] = [ numbers[j], numbers[i] ];
  }

  return () => numbers.pop() ?? null;
}
Ответ написан
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
function makeRandomizer([ min, max ]) {
  // сортировка может занять несколько больше времени чем обычно.
  const numbers = [...Array(max - min + 1)].map((n, i) => min + i).sort(()=>Math.random()<0.5?-1:1);
  return () => numbers.shift() ?? null;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы