@architawr
"Ok, Google" и все твои проблемы решены

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

Здравствуйте, тостеровчане!
Необходимо получать уникальные рандомные числа в определенном диапазоне и помещать их в массив, но они должны быть уникальны в том числе и относительно промежутка. На словах совсем не понятно, поэтому приведу пример:

Я вызываю функцию getRandomArray(10, 1, 100, 5), где 10 - количество чисел, 1 - минимальное число, 100 - максимальное число, 5 - "промежуток уникальности", после чего функция вернула число, например, 50 и поместила его в массив. Но в это массиве не должны оказаться числа в диапазоне ((50 - 5) - (50 + 5)), те 45-55. То есть в этом массиве не должно оказаться чисел 45, 46, 47, 48, ... , 53, 54, 55 и тд.

Сейчас есть код, который не работает из-за нехватки оперативной памяти, хотя логика вроде бы правильная.
function rangeByInt(int, step) {
      var range = [],
        startRange = int - step,
        endRange = int + step;

      for (var i = startRange; i <= endRange; i++) {
        range.push(i);
      }

      return range;
    },
    function arrayRandom(len, min, max) {
      var toReturn = [],
        tempObj = {},
        i = 0;

      for (; i < len; i++) {
        var randomInt = Math.floor(Math.random() * (max - min + min));

        const range = rangeByInt(randomInt, 30);
        for (var j = 0; j < range.length; j++) {
          if ((tempObj["key_" + randomInt] === undefined) & (tempObj["key_" + tempInt[j]] === undefined)) {
            tempObj["key_" + randomInt] = randomInt;
            tempObj["key_" + tempInt[j]] = tempInt[j];
            toReturn.push(randomInt);
          } else {
            i--;
          }
        }
        
      }

      return toReturn;
    }
  }

Небольшое пояснение к коду:
Функция rangeByIntвозвращает массив с числами, которые вычисляются путем вычитания и сложения из int параметра step. Например:
console.log(rangeByInt(50, 10)) // [40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60]


Функция arrayRandomпринимает следующие параметры: len - количество чисел, min, max - значения диапазона для генерации случайных чисел. Но, к сожалению, при добавлении цикла по перебору range сайт просто виснет и через какое-то время выкидывает ошибку о нехватке оперативной памяти
  • Вопрос задан
  • 792 просмотра
Решения вопроса 2
sfi0zy
@sfi0zy Куратор тега JavaScript
Creative frontend developer
Если я все правильно понял:
function getRandoms(n, min, max, range) {
    let possibleNumbers = Array.from(
        Array(max - min + 1).keys(), x => x + min);
    
    let randoms = [];
    
    for (let i = 0; i < n; i++) {
        if (possibleNumbers.length === 0) {
            break;
        }
        
        const index = Math.floor(Math.random() * possibleNumbers.length);
        const value = possibleNumbers[index];
        
        randoms.push(value);
        
        for (let j = index + range; j > index - range; j--) {
            if (possibleNumbers[j] && Math.abs(possibleNumbers[j] - value) < range) {
                possibleNumbers.splice(j, 1);
            }
        }
    }
    
    return randoms;
}
Ответ написан
RAX7
@RAX7
function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function getRandomArray(len, min, max, mid) {
  const res = [];
  let rand;
  for (let i = 0; i < len; i++) {
    if (Math.random() < 0.5) {
      rand = getRandomInt(min, (max - min) / 2 + min - mid);
    }
    else {
      rand = getRandomInt((max - min) / 2 + min + mid, max);
    }
    res.push(rand);
  }
  return res;
}

getRandomArray(10, 100, 1750, 30);

https://repl.it/repls/LiveWorthlessJavabytecode
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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