Как генерировать уникальные случайные числа относительно промежутка? Здравствуйте, тостеровчане! Необходимо получать уникальные рандомные числа в определенном диапазоне и помещать их в массив, но они должны быть уникальны в том числе и относительно промежутка. На словах совсем не понятно, поэтому приведу пример: Я вызываю функцию 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 сайт просто виснет и через какое-то время выкидывает ошибку о нехватке оперативной памяти
Проблема в вашем коде заключается в том, что вы не правильно проверяете уникальность чисел относительно промежутка. Вот исправленный вариант функции arrayRandom:
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, uniqueRange) { var toReturn = [], tempObj = {}; for (var i = 0; i < len; i++) { var randomInt; do { randomInt = Math.floor(Math.random() * (max - min + 1) + min); } while (tempObj[randomInt] || checkRange(randomInt, uniqueRange, toReturn)); tempObj[randomInt] = true; toReturn.push(randomInt); } return toReturn; } function checkRange(num, range, arr) { for (var j = 0; j < arr.length; j++) { if (Math.abs(num - arr[j]) <= range) { return true; } } return false; } console.log(arrayRandom(10, 1, 100, 5));
Этот код будет генерировать уникальные случайные числа относительно заданного промежутка и добавлять их в массив. Функция checkRange проверяет, чтобы новое число было уникальным относительно промежутка uniqueRange от уже сгенерированных чисел.
Проблема в вашем коде заключается в том, что вы не правильно проверяете уникальность чисел относительно промежутка. Вот исправленный вариант функции arrayRandom:
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, uniqueRange) {
var toReturn = [],
tempObj = {};
for (var i = 0; i < len; i++) {
var randomInt;
do {
randomInt = Math.floor(Math.random() * (max - min + 1) + min);
} while (tempObj[randomInt] || checkRange(randomInt, uniqueRange, toReturn));
tempObj[randomInt] = true;
toReturn.push(randomInt);
}
return toReturn;
}
function checkRange(num, range, arr) {
for (var j = 0; j < arr.length; j++) {
if (Math.abs(num - arr[j]) <= range) {
return true;
}
}
return false;
}
console.log(arrayRandom(10, 1, 100, 5));
Этот код будет генерировать уникальные случайные числа относительно заданного промежутка и добавлять их в массив. Функция checkRange проверяет, чтобы новое число было уникальным относительно промежутка uniqueRange от уже сгенерированных чисел.