Допускается ли повторение элементов?
Если да, то просто достаём случайные элементы из исходного массива:
const createArr = (source, maxLength = source.length) =>
Array.from(
{ length: -~(Math.random() * maxLength) },
() => source[Math.random() * source.length | 0]
);
Если элементы не должны повторяться, тогда вырезаем случайные элементы из копии исходного массива:
const createArr = ([...source], maxLength = source.length) =>
Array.from(
{ length: Math.min(source.length, -~(Math.random() * maxLength)) },
() => source.splice(Math.random() * source.length | 0, 1)[0]
);
Или, перемешиваем копию исходного массива и берём сколько надо элементов из начала:
function createArr([...source], maxLength = source.length) {
for (let i = source.length; --i > 0;) {
const j = Math.random() * -~i | 0;
[ source[j], source[i] ] = [ source[i], source[j] ];
}
return source.slice(0, -~(Math.random() * maxLength));
}