【问题标题】:Randomizing a position placement of an object随机化对象的位置放置
【发布时间】:2012-05-23 21:32:50
【问题描述】:

只是附加信息:这是针对我正在开发的游戏项目的。

我正在尝试创建一种有效的随机化算法,该算法根据可用空间的长度放置多个对象(彼此排列)。

直接解决问题:给定一个长度 = lengthOfArea 的可用空间,并且要定位的对象数 = numObjects 其中每个对象的长度,lengthObject = (lengthOfArea/2) / numObjects。 (这样,对象占用的空间总量是可用空间长度的一半)。

我应该寻找每个对象的中心位置并返回一个数组。

这是我目前的尝试:

public int[] FindObjectPositions(int lengthOfArea, int numObjects, Random random)
  {
    int lengthOfObject = (lengthOfArea / 2) / numObjects;
    int[] positionsPicked = new int[numObjects];
    int minPosition = lengthObject / 2;
    int maxPosition = lengthOfArea - (lengthObject / 2);
    for (int i = 0; i < numObjects; i++)
    {
      int newPosition;
      do 
        {
          newPosition = minPosition + random.Next(maxPosition - minPosition);
        } while (!IsPositionValid(positionsPicked, newPosition, lengthObject));
        positionsPicked[i] = newPosition;
    }
    return positionsPicked;
  }

public bool IsPositionValid(int[] positionsPicked, int newPosition, int lengthObject)
  {
    for (int i = 0; i < positionsPicked.Length; i++)
    {
      if (Math.Abs(positionsPicked[i] - newPosition) <= (lengthObject / 2))
        return false;
    }
    return true;
  }

基本上,我正在做的是不断随机地为每个对象找到一个有效位置。我只是想知道它是否效率低下。另外,我想知道我是否会用这种方法陷入僵局?

【问题讨论】:

    标签: c# performance algorithm


    【解决方案1】:

    如果存在无法容纳更多对象的配置,则可能会发生死锁。例如,如果有 30 个空格,每个对象有 5 个空格,那么配置

    _ _ _ _ x x x x x _ _ _ _ x x x x x _ _ _ _ x x x x x _ _ _

    即使有 15 个空地,也没有地方可以容纳另一个物体!


    假设有m 开放空间,每个对象的宽度为w。一种不会死锁的方法是生成m-w+1 数字1, 2, ..., m-w, m-w+1 的列表。然后随机选择一个 - 这将代表您的对象的最左侧位置。然后删除该数字右侧和左侧w-1 数字 - 这表示对象为w 宽,并且没有其他宽度为w 的对象将适合@987654328 @ 左边的空格。

    例如,如果m = 20w = 3

    创建一个从 1 到 18 的列表

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

    然后随机选择一个。假设我们选择 10。那么 10、11、12 的空间被我们的对象填充,而 8、9 的空间不能是另一个对象的最左边的位置,所以我们删除数字 8 到 12。

    1 2 3 4 5 6 7 13 14 15 16 17 18

    假设我们接下来选择 18。然后我们去掉16-18:

    1 2 3 4 5 6 7 13 14 15

    以此类推,直到没有数字为止。


    上述方法不会死锁,但它还有另一个问题:可能有一个包含(比如说)6 个对象的配置,但上面的方法可能只生成一个配置里面有 4 或 5 个物体,没有更多的空间。为了解决这个问题,我们可以计算出 6 个对象应该有多少个空白区域,而不是为我们的对象选择随机位置,然后为我们的空白区域选择随机点(使用上述方法)。

    这将为您提供所需的对象数量,随机间隔,不会出现死锁。

    【讨论】:

    • 哦,对不起,我的代码有点混乱。我实际上有一个限制,其中对象的长度实际上是 (lengthOfArea/2) / numObjects ... 所以我实际上不应该将 lengthOfObject 作为参数。这会使解决方案更简单或更复杂吗? (假设我们也可以保证除法返回整数,没有余数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多