使用 rand() 从 4 个随机方向中选择一个
Select one of 4 random directions with rand()?
我想从 4 个方向中随机选择:
movePlayer(map, &positionPlayer, direction);
其中方向是UP
、DOWN
、LEFT
和RIGHT
之一。
我还没有发现如何使用rand()
函数执行此操作。
我该怎么做?我是否需要为每个方向分配一个数字,然后在这些范围内选择一个随机数字?
谢谢你的帮助。
是的,您需要为每个方向分配一个数字。即。0=向上 1=向下 2=左 3=右你需要这样的代码:
int direction = rand()%4;
最简单的方法是简单地对 rand 函数进行取模,以获得 0 到 3(包括 0)之间的数字。
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。
如果direction
是一个枚举:
enum Direction {
UP,
DOWN,
LEFT,
RIGHT
} direction;
在 C/C++ 中,枚举常量表示为整数。第一个值 UP
对应于 0,DOWN
为 1,依此类推。
所以你可以打电话:
movePlayer(map, &positionPlayer, static_cast<Direction>(rand() % 4));
这将使用随机选择的方向值调用movePlayer
。
并不总是建议仅使用模运算符来缩小rand()
的范围。如果你需要更均匀分布的东西,你应该研究其他方法。
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)));
}
更好的方法是在 rand()%4 之前调用 srand(time(0))。这将确保每次执行程序时,都会生成不同的随机数集。调用 rand() 而不调用 srand() 将在每次执行程序时生成相同的随机数集。
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 选择一个元素而不是一个对象的数组的原因
- 如何在 c++ 中从数组中选择一个随机数?
- 从C++数组中选择一个随机元素
- 从 std::vector 中选择一个元素,而不是给定元素
- 如何让用户在 c++ 中选择一个数字
- 如何更改此notify_one以便它选择一个随机线程
- C++ 在运行时选择一个随机对象
- 如何在C++中创建数字列表,以便它可以选择一个随机数?
- 如果我们从每个 Y 向量中选择一个值,则 X 数字的每个组合都可能
- 从两列中选择一个数字并进行计算
- 如何使用std ::有条件地选择一个免费功能
- 我如何在众多字符串中选择一个并显示所有可能的结果
- 在编译时选择一个变量
- 如何防止用户多次选择一个选项
- 如何强制clistctrl总是选择一个项目
- 随机选择一个 0 到 8 之间的数字,直到没有数字可以选择,然后重新开始
- 选择一个方法作为(默认)模板参数
- RapidXml:选择一个first_attribute值
- 选择一个随机方块并生成一个随机数