Генератор случайных чисел без повторений js

Рейтинг: 3Ответов: 2Опубликовано: 19.06.2023

Задание состоит в том, чтобы создать массив объектов, в котором значения будут генерироваться случайным образом в заданном диапазоне. При этом генерируемые цифры в значении не должны повторяться.

//Генератор случайный чисел
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. Я только обучаюсь, поэтому буду признателен, если опишите логику и пример решения как можно более простым языком.

Ответы

▲ 3Принят

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);

▲ 1

Возможно это то что Вам нужно. Хотя вопрос действительно не совсем ясен.

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>