Сначала подумал что можно рандомизированный массив засунуть в set...
Надо наоборот - сначала set, потом массив (только осторожно - если интервал возможных значений меньше желаемой длины, то цикл получится бесконечным; надо или уменьшить длину, или кидать ошибку):
function createRandomArr(size, min, max) {
if (size > (max -= ~-min)) {
throw 'невозможно создать массив указанного размера';
}
const values = new Set;
for (; values.size < size; values.add(min + Math.random() * max | 0)) ;
return [...values];
}
const arr = createRandomArr(40, 1, 100);
Но вообще, есть и другие способы.
Например, можно создать массив со всеми возможными значениями, и выдёргивать из него элементы случайным образом, сколько надо:
function createRandomArr(size, min, max) {
const len = max - min + 1;
const arr = [...Array(len).keys()];
return Array.from(
{ length: Math.min(size, len) },
() => min + arr.splice(Math.random() * arr.length | 0, 1)[0]
);
}
Или, создать массив со всеми возможными значениями, перемешать его, взять кусок нужного размера:
function createRandomArr(size, min, max) {
const arr = Array.from(
{ length: max - min + 1 },
(_, i) => i + min
);
for (let i = arr.length; --i > 0;) {
const j = Math.floor(Math.random() * (i + 1));
[ arr[j], arr[i] ] = [ arr[i], arr[j] ];
}
return arr.slice(-size);
}