Рандомный интервал на JS
Столкнулся с задачкой которую не знаю как решить. Возможно ли на JS сделать рандомный временной интервал? Например нужно кликать по элементу в диапазоне времени от 45 до 80 сек, чтоб каждый клик был с разным интервалом, 45сек, 55сек, 71сек, 68сек, 47сек и так далее в рамках установленного диапазона и чтоб интервал друг за другом не повторялся, 44сек, 44сек.
Ответы (2 шт):
Для генерирования случайного числа в диапазоне достаточно запомнить эту «идиому»:
Getting a random integer between two values, inclusive
Но чтобы числа не повторялись, нужно добавлять вспомогательную структуру данных (например, Set), чтобы хранить в ней использованные числа, проверять и отбраковываеть уже встречавшиеся.
Например, этот код использует функцию, которая создаёт генератор случайных чисел с привязкой к такой структуре данных. Когда структура заполняется всеми возможными числами диапазона, она очищается и перебор начинается снова.
function createRandomGenerator(min, max) {
const usedRandoms = new Set();
const limit = max - min + 1;
return function getRandom() {
if (usedRandoms.size === limit) usedRandoms.clear();
let random;
while (usedRandoms.has(random = Math.floor(Math.random() * (max - min + 1) + min))) ;
usedRandoms.add(random);
return random;
};
}
const getRandomOneTen = createRandomGenerator(1, 10);
for (let i = 0; i < 10; i++) console.log(getRandomOneTen());
console.log('----------');
for (let i = 0; i < 10; i++) console.log(getRandomOneTen());
Думаю, вы сможете приспособить этот пример к вашему случаю.
Единственное что — если диапазон чисел будет очень большой, функция со временем может нагружать процессор в поисках ещё не использованного числа, отбраковывая всё больше попыток. Тогда стоит вынести её в worker или добавить небольшие таймауты уже в неё, чтобы она не мешала интерактивности страницы.
Если я правильно понял задачу.
//# Тут мы создаём рандомный интервал в диапазоне
let RRh = 0; // Храним предыдущее значение
function RandomRange(a,b) { // Функция принимает минимальное и максимальное значение
let c = Math.floor(Math.random() * (b - a + 1)) + a; // Получаем рандомное число
return c !== RRh ? RRh = c : RandomRange(a,b); // Сверяем его с прошлым, если совпало то ништяк, если нет то всё по новой.
}
console.time('click'); // Для наблюдения, сколько был интервал
//# Это для имуляции
let elem = document.querySelector('#click'), // Берём элемент по которому будем кликать
timer = setTimeout(function tick() { // Тут рекурсивный таймер
elem.click(); // Который кликает каждый раз в заданный интервал
timer = setTimeout(tick, RandomRange(5,15) * 1000); // Интервал будет рандомный от 5 до 15 секунд
}, RandomRange(5,15) * 1000);
//# А тут чисто визуализация того, что клик действительно происходит
elem.addEventListener('click', function(e) {
console.timeEnd('click'); // Для наблюдения, сколько был интервал
let $self = e.target;
$self.style.cssText = 'border-color: red; transform: scale(1.25);'
$self.innerText = 'CLICKED';
setTimeout(function() {
$self.style.cssText = '';
$self.innerText = 'element';
console.time('click'); // Для наблюдения, сколько был интервал
}, 750);
});
#click {
display: inline-block;
border: 2px solid gray;
padding: .5em;
margin: 30px;
}
.as-console-wrapper {max-height: 22px !important;}
<div id="click">element</div>