对于我有ascii地图的游戏,它存储在一个数组中。 #代表墙和。代表可步行的空间。在游戏开始时,玩家需要随机放置在一个不是#的广场上,这样做最有效的算法是什么?如果空间不合法,我可以随机放置播放器,然后重新播放,但我确信有更有效的方法。
答案 0 :(得分:1)
“我们应该忘记小的效率,比如大约97%的时间:过早的优化是所有邪恶的根源” - Knuth
但是,这取决于墙壁与空间的比例:
如果与墙壁相比存在大量空间,则可能只需要在找到空间之前重复尝试少量空间。
Random rnd = new Random();
int space = -1;
while (space == -1) {
int index = rnd.nextInt(positions.length);
if (!isAWall(positions[index])) {
space = positions[index];
}
}
如果1000个墙壁中只有1个空间,则可能需要一段时间才能随机找到。在这种情况下,首先获取所有空间并从那些已知有效选择中随机选择可能更为明智。
spaces = onlySpaces(positions);
Random rnd = new Random();
space = spaces[rnd.nextInt(spaces.length)];
答案 1 :(得分:0)
我会在数组上运行一次,并将所有可用空间的索引存储在一个单独的数组中,然后随机选择其中一个索引。
这可以保证线性复杂度,而完全随机算法可以具有非常高的最坏情况复杂度,甚至可以永久运行,如果没有空闲空间的话。