Предложил бы редуцировать измерения )
свести двумерное поле к одномерной колбасе.
Если поле 6x6, то это одномерный массив длиной 36 элементов. Каждый элемент — одна из клеток на поле.
Номер элемента однозначно переводится в координаты (x, y), если известна длина стороны поля.
Например, поле 6x6. Нумерация от нуля: 0..5 Число, допустим, 13.
X = 13 % 6 = 1
Y = floor(13 / 6) = 2
Теперь, из колбасы всех возможностей надо отобрать случайным образом сколько требуется случайных.
В цикле брать один случайный элемент из оставшихся в колбасе. Причём забирать, вынимать его оттуда, сокращая массив оставшихся возможностей.
Так не понадобится холостых повторных попаданий в ранее выбранные клетки. Не понадобится по два случайных генерить. Один рандом — одно 100% попадание.
function generator(quantity, side = 6) {
const length = side * side;
if (quantity > length) throw new Error('too much u ask');
const options = Array.from({ length }, (_, i) => i); // [0,1,2,3, .. ,35]
const nToPoint = n => ({ x: n % side, y: Math.floor(n / side) }); // 13 => {x:1, y:2}
return Array.from({ length: quantity }, () =>
nToPoint(
options.splice(Math.floor(Math.random() * options.length), 1).pop()
)
);
}
console.log(generator(4));
// [{x:1,y:2}, {x:0,y:4}, {x:1,y:0}, {x:4,y:4}]