@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;
    }
  };

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

function makeRandomizer([ min, max ]) {
  const numbers = [...Array(max - min + 1)].map((n, i) => min + i);
  return () => numbers.splice(Math.random() * numbers.length | 0, 1)[0] ?? 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;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
19 янв. 2021, в 00:06
1000 руб./за проект
18 янв. 2021, в 22:36
50000 руб./за проект