2013-11-18 1 views
1
while(MatriceLib.compteTrue(champsMine)!= nbMines) 
     { 
      int i = (int) Math.floor((Math.random()*(longueur-1))); 
      int j = (int)Math.floor((Math.random()*(largeur-1))); 
      champsMine[i][j] = true; 
} 

champsMine - это булевая матрица с баулером в случайных положениях. compteTrue возвращает значение int числа true в матрице. nbMines - это номер истины, который должна иметь матрица.Попытка заполнить булевую матрицу со случайными значениями

Проблема в том, что для заполнения матрицы значениями требуется много времени.

Есть ли способ сделать его более эффективным?

ответ

4

Вы не публикуете много кода, но, похоже, вы каждый раз подсчитываете количество элементов в массиве true. Это медленная часть. Вместо этого, рассмотреть вопрос о сохранении отсчета, как вы идете, например .:

int count = 0; // or whatever the current count is, if there are already true elements 
while (count < nbMines) { 
    int i = ...; 
    int j = ...; 
    if (!champsMine[i][j]) { 
     ++ count; 
     champsMine[i][j] = true; 
    } 
} 

Конечно, это замедлит как число false слотов остального уменьшается (увеличивается вероятность случайных позиций уже установлено). Альтернативный подход состоит в том, чтобы создать массив/список всех комбинаций (i,j) (по одному для каждой ячейки в сетке), случайным образом перетасовать этот список, затем взять первые nbMines координат из этого списка и установить для этих значений значение true. Это немного сложнее настроить, но все же просто, и будет очень быстрым (заполняя список, а затем перетасовывая его, вы не сможете выбрать уже установленные координаты). Кроме того, естественно, что вероятность того, что nbMines больше, чем количество ячеек сетки.

+0

Вы избили меня в этом :) Shuffling будет намного более эффективным, вероятно, так же быстро, как 2 вызова 'compteTrue'. – beaker