• Почем цикл do while вызывает зависание страниц браузера?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Предложил бы редуцировать измерения )
    свести двумерное поле к одномерной колбасе.

    Если поле 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}]
    Ответ написан
    Комментировать