随机将元素放在数组中

时间:2014-02-15 15:54:47

标签: java algorithm random

对于我有ascii地图的游戏,它存储在一个数组中。 #代表墙和。代表可步行的空间。在游戏开始时,玩家需要随机放置在一个不是#的广场上,这样做最有效的算法是什么?如果空间不合法,我可以随机放置播放器,然后重新播放,但我确信有更有效的方法。

2 个答案:

答案 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)

我会在数组上运行一次,并将所有可用空间的索引存储在一个单独的数组中,然后随机选择其中一个索引。

这可以保证线性复杂度,而完全随机算法可以具有非常高的最坏情况复杂度,甚至可以永久运行,如果没有空闲空间的话。