0

4つの方向からランダムに選択したい:

movePlayer(map, &positionPlayer, direction);

UPここで、方向は、、、、およびのいずれDOWNLEFTですRIGHT

この関数でこれを行う方法はまだわかりませんrand()

これどうやってするの?各方向に番号を割り当ててから、それらの範囲内で乱数を選択する必要がありますか?

ご協力ありがとうございました。

4

5 に答える 5

6

はい、各方向に番号を割り当てる必要があります。すなわち。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に対応し、DOWNは1、というように続きます。

だからあなたはただ呼び出すことができます:

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に変換したくない場合は、次enum 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))を呼び出すことです。これにより、プログラムを実行するたびに、異なる乱数のセットが生成されます。srand()なしでrand()を呼び出すと、プログラムが実行されるたびに同じ乱数のセットが生成されます。

于 2012-05-09T04:40:35.937 に答える