Генератор случайных чисел без повторений js
Задание состоит в том, чтобы создать массив объектов, в котором значения будут генерироваться случайным образом в заданном диапазоне. При этом генерируемые цифры в значении не должны повторяться.
//Генератор случайный чисел
const random = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
//Генератор фото
const dataPhoto = () => ({
id: random(1, 25), //Цифры не должны повторяться
url: `photos/${random(1, 25)}.jpg`, //Цифры не должны повторяться
});
const test = Array.from({length: 25}, dataPhoto);
Т.е. id и url должен быть равен 1-25, при этом цифры не должны повторяться, но, к примеру, может быть так что у id и url цифры могут совпадать.
Пробовал сделать генератор чисел с записью в массив и проверкой оттуда есть ли там выпадаемое число, но, видимо, что-то было написано не так и постоянно выдавало undefined. Я только обучаюсь, поэтому буду признателен, если опишите логику и пример решения как можно более простым языком.
Ответы (2 шт):
Возможно это то что Вам нужно. Хотя вопрос действительно не совсем ясен.
elem.onclick = function() {
let data = [
...new Set(
Array.from({
length: 25,
},
() => Math.floor(Math.random() * 25)
)
),
].filter((n) => {
return n != 0;
});
let id = data[Math.floor(Math.random() * data.length)];
let url = data[Math.floor(Math.random() * data.length)];
let num = data;
//Уникальные от 1 до 25
document.getElementById("num").innerHTML = "Уникальные - " + num;
//Случайное из уникальных - id
document.getElementById("id").innerHTML = "Id - " + id;
//Случайное из уникальных - url
document.getElementById("url").innerHTML = "url - " + url;
};
<button type="button" id="elem">Жми</button>
<p id="num"></p>
<p id="id"></p>
<p id="url"></p>
range создаёт массив чисел [from, to). shuffle случайно перемешивает массив (Фишер-Йейтс). Программа создаёт массив идентификаторов, массив адресов, перемешивает оба массива, соединяет в результат:
const range = (from, to) => [...Array(to - from).keys()].map(v => v + from);
const shuffle = a => {
for (let i = 1; i < a.length; ++i) {
const j = Math.floor(Math.random() * (i + 1)); // random in [0, i]
[a[i], a[j]] = [a[j], a[i]]; // swap a[i] <-> a[j]
}
};
const ids = range(1, 26);
const urls = ids.map(v => `photos/${v}.jpg`)
shuffle(ids);
shuffle(urls);
const result = ids.map((id, i) => ({id: id, url: urls[i]}));
console.log(result);