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

21 Авг 2019 в 06:04
163 +1
0
Ответы
1

Проблема в вашем коде заключается в том, что вы не правильно проверяете уникальность чисел относительно промежутка. Вот исправленный вариант функции 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 от уже сгенерированных чисел.

20 Апр в 13:24
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 835 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир