Здравствуйте, тостеровчане!
Необходимо получать уникальные рандомные числа в определенном диапазоне и помещать их в массив, но они должны быть уникальны в том числе и относительно промежутка. На словах совсем не понятно, поэтому приведу пример:
Я вызываю функцию
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 сайт просто виснет и через какое-то время выкидывает ошибку о нехватке оперативной памяти