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是矩阵必须具有的真实数。
问题是用矩阵填充矩阵需要花费很多时间。
有没有办法让它更有效率?
答案 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
大于网格单元数的可能性,自然也是安全的。