Как реализовать генерацию пар чисел без повторений?

Нужен алгоритм, для создания 10(?Или больше) пар чисел, без повторений
Задаются две границы, числа не могут их превышать.
Допустим, 10 и 30. Тогда каждое число должно находится в промежутке [10,30]
Изначально я просто брала рандомные числа с помощью такой функции:
function getRandomInt(min, max) {
    let rand = min + Math.random() * (max - min) ;
    return Math.round(rand);
}

Проблема такого подхода в том, что часто возникают одинаковые пары, а с моей задачей такого не должно происходить, либо свести это к минимуму.
Пробовала сделать через цикл while, который смотрит на количество элементов в массиве, и пока их меньше 10 он добавляет туда внутренний массив с 2 числами, а если подобный есть то просто продолжает работу, но это слишком затратно выходит. Подскажите, как быть?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
nikolayshabalin
@nikolayshabalin
Автор профессиональных курсов в HTML Academy
function generateNumberPairs(min, max, count) {
  if (max - min + 1 < count * 2) {
    console.error('Невозможно создать запрошенное количество пар без повторений в данном диапазоне.');
    return [];
  }

  const numbers = [];
  const pairs = [];

  // Создаем массив чисел в заданном диапазоне
  for (let i = min; i <= max; i++) {
    numbers.push(i);
  }

  // Перемешиваем массив случайным образом
  for (let i = numbers.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [numbers[i], numbers[j]] = [numbers[j], numbers[i]];
  }

  // Формируем пары чисел
  for (let i = 0; i < count; i++) {
    const pair = [numbers[i * 2], numbers[i * 2 + 1]];
    pairs.push(pair);
  }

  return pairs;
}

// Пример использования
const pairs = generateNumberPairs(10, 30, 10);
console.log(pairs);


В этом примере функция generateNumberPairs принимает минимальное значение min, максимальное значение max и количество пар чисел count, которое нужно сгенерировать. Если заданный диапазон недостаточно широк для создания запрошенного количества пар без повторений, функция выведет сообщение об ошибке и вернет пустой массив.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Создаём массив [(10, 10) ... (30, 30)], тасуем его (shuffle), берём из него пары чисел подряд.
Ответ написан
Ваш ответ на вопрос

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

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