0

我想从 4 个方向中随机选择:

movePlayer(map, &positionPlayer, direction);

其中方向是UP, DOWN,LEFT和之一RIGHT

我还没有找到如何使用该rand()功能来做到这一点。

我怎样才能做到这一点?我是否需要为每个方向分配一个数字,然后在这些范围内选择一个随机数?

谢谢您的帮助。

4

5 回答 5

6

是的,您需要为每个方向分配一个编号。IE。0=UP 1=DOWN 2=LEFT 3=RIGHT 你需要这样的代码:

int direction = rand()%4;
于 2012-05-09T02:19:39.673 回答
4

最简单的方法是简单地对 rand 函数进行取模以获得 0 到 3(含)之间的数字。

int x = rand() % 4;

然后你可以简单地执行一个 switch 语句来选择方向

switch(x)
{
   case 0:
      movePlayer(map, &positionPlayer, UP);
      break;

   case 1:
      movePlayer(map, &positionPlayer, DOWN);
      break;

   case 2:
      movePlayer(map, &positionPlayer, LEFT);
      break;

   case 3:
      movePlayer(map, &positionPlayer, RIGHT);
      break;
}

当然,这不会是完全随机的完美分布(模数有点像黑客)。

如果您想要实际分布的真正随机性,那么您可能需要研究 Boost.Random。

于 2012-05-09T02:19:47.327 回答
2

如果direction是一个枚举:

enum Direction {
    UP,
    DOWN,
    LEFT,
    RIGHT
} direction;

在 C/C++ 中,枚举常量表示为整数。第一个值UP对应于 0,对应于DOWN1,依此类推。

所以你可以打电话:

movePlayer(map, &positionPlayer, static_cast<Direction>(rand() % 4));

它将movePlayer使用随机选择的方向值调用。

仅使用模运算符来缩小 的范围并不总是可取的rand()。如果您需要分布更均匀的东西,您应该研究其他方法

于 2012-05-09T02:23:09.627 回答
2

rand() 不一定很好。<random>可能是一个更好的选择。

C++11:

#include <random>
#include <iostream>

enum Direction : char {
  north, east, south, west
};

std::ostream &operator<< (std::ostream &os, Direction d) {
  switch (d) {
    case Direction::north : return os << "North";
    case Direction::east  : return os << "East";
    case Direction::south : return os << "South";
    case Direction::west  : return os << "West";
  }
}

std::uniform_int_distribution<Direction> random_direction
  {Direction::north, Direction::west};

int main() {
  // you can use any of several different sources of random values depending on your needs
  std::mt19937 eng;
  for (int i=0;i<10;++i)
    std::cout << random_direction(eng) << '\n';
}

如果您不希望将方向隐式转换为 int,则可以使用 anenum class和不同的定义random_direction

template<typename Engine>
Direction random_direction(Engine &&eng) {
  std::uniform_int_distribution<> dist
    {int(Direction::north),int(Direction::west)};
  return Direction(dist(std::forward<Engine>(eng)));
}
于 2012-05-09T03:54:05.283 回答
0

更好的方法是在 rand()%4 之前调用 srand(time(0))。这将确保每次执行程序时都会生成不同的随机数集。每次执行程序时调用 rand() 而不使用 srand() 将生成相同的随机数集。

于 2012-05-09T04:40:35.937 回答