Мне нужно создать функцию makeRandom, которая принимает диапазон чисел в виде массива, где первое число является началом диапазона, второе — концом, включающим это число в диапазон. Результатом этой функции должна быть функция, а вызов возвращает случайное число из диапазона. Возвращаемые числа должны быть уникальными. Если у меня закончатся уникальные номера, я должен вернуть ноль.
Это должно работать так:
const getRandom = makeRandom([1, 5]);
getRandom() === 3
getRandom() === 4
getRandom() === 5
getRandom() === 2
getRandom() === 1
getRandom() === null
getRandom() === null
Итак, я попытался:
function makeRandom(numbers) {
return () => {
let randNumber = Math.floor(Math.random() * numbers.length);
for (let i = 0; i < numbers.length; i++) {
randNumber += numbers[i];
if (randNumber === numbers[i]) {
return true;
}
if (randNumber === numers[i].length) {
return true;
}
}
if (!numbers) {
return null;
}
};
}
Но это не работает. Итак, как лучше всего это сделать?
Вы можете добавить все значения в массив и соединить массив, если массив имеет длину или возврат null
.
const
makeRandom = ([min, max]) => {
const values = [];
while (min <= max) values.push(min++);
return () => values.length
? values.splice(Math.floor(Math.random() * values.length), 1)[0]
: null;
},
getRandom = makeRandom([1, 5]);
console.info(getRandom());
console.info(getRandom());
console.info(getRandom());
console.info(getRandom());
console.info(getRandom());
console.info(getRandom());
console.info(getRandom());
Я бы лично сгенерировал список чисел. Я бы перетасовал их, что немного лучше, чем случайное распределение. Затем я бы вытащил их из массива.
// Fisher-Yates shuffle
function shuffle(array) {
let currentIndex = array.length, temporaryValue, randomIndex;
while (0 !== currentIndex) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
// create a range of numbers
function range(size, startAt = 0) {
return [...Array(size).keys()].map(i => i + startAt);
}
function makeRandom(low, high) {
const numbers = shuffle(range(high - low + 1, low));
return function () {
return numbers.length ? numbers.pop() : null;
}
}
var myRandom = makeRandom(5,10);
console.info(myRandom());
console.info(myRandom());
console.info(myRandom());
console.info(myRandom());
console.info(myRandom());
console.info(myRandom());
console.info(myRandom());
console.info(myRandom());
Большое спасибо за ответ!