cannibal_corpse
@cannibal_corpse
Верстальщик руками

Как создать массив строк случайной длины из предложенных строк?

Есть массив со строками:

let arr = ['Яблоко', 'Груша', 'Апельсин', 'Слива',];

Надо создать несколько массивов случайной длины из массива arr.

Пример результата:

arr1 = ['Яблоко'];
arr2 = ['Яблоко', 'Груша', 'Апельсин'];
arr3 = ['Слива', 'Груша'];

Как это сделать?
  • Вопрос задан
  • 2284 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
const createArr = (source, maxLength) =>
  [...Array(1 + Math.random() * maxLength | 0)].map(() => source[Math.random() * source.length | 0]);


const [ arr1, arr2, arr3 ] = [...Array(3)].map(() => createArr(arr, 5));

Если элементы не должны повторяться, тогда так (исходный массив копируется и из него вырезаются случайные элементы):

const createArr = ([...source], maxLength) => Array.from(
  { length: Math.min(source.length, 1 + Math.random() * maxLength | 0) },
  () => source.splice(Math.random() * source.length | 0, 1)[0]
);

или, копируем исходный массив, перемешиваем копию, берём случайное количество элементов из начала:

function createArr(source, maxLength) {
  const arr = source.slice();

  for (let i = arr.length; --i > 0; ) {
    const j = Math.random() * (i + 1) | 0;
    [ arr[j], arr[i] ] = [ arr[i], arr[j] ];
  }

  return arr.slice(0, 1 + Math.random() * maxLength | 0);
}
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Генерируешь случайное число в промежутке от 1 до arr.length. Это длина будущего массива.

В цикле выбираешь случайные значения из arr, вносишь в новый массив.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Нужен генератор случайных чисел. в JS есть Math.random();

Далее, чтобы сгенерировать один массив пройдитесь по всему массиву строк и добавляйте текущую строку к ответу, если random() < kThreshold. kThreshold подбирайте исходя из того, какой длины вам нужны случайные массивы. В среднем в ответе будет kThreshold*array.length() элементов. Т.е. при kThreshold=0.5, в среднем сгенерированные массивы будут содержать по половине всех строк.

Минус этого метода, что чаще всего сгенерированные массивы будут средней длины. Массив из всех строчек или из одной единственной строчки будут маловероятны, но это может и не минус - зависит от того, зачем вам это надо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы