试图用随机值填充布尔矩阵

时间:2013-11-18 17:44:02

标签: java loops random matrix boolean

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是布尔矩阵,随机位置有booleran。 compteTrue返回矩阵中true数的int值。 nbMines是矩阵必须具有的真实数。

问题是用矩阵填充矩阵需要花费很多时间。

有没有办法让它更有效率?

1 个答案:

答案 0 :(得分: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坐标并设置这些值为真。设置起来稍微复杂一些,但仍然很简单,而且速度非常快(填充列表然后改组它可以保证你不会选择已经设置过的坐标)。对于nbMines大于网格单元数的可能性,自然也是安全的。