因此,我正在尝试寻找一种非常有效的方法来从范围生成数字。基本上,我正在为计算机与计算机之间的井字游戏编写代码。我要确保计算机在2D数组中随机标记X / O。随机点将是array [random] [random]。
例如,我要移动3x3的TicTacToe
我使用:
int range = 3;
int random = rand() % range + 1;
几百次之后,我得到的随机数只有3个,这导致游戏中无效的移动。
我想知道您是否可以给我一个思路,如何在一个很小的范围之间生成一个非常线性的随机整数。非常感谢!
答案 0 :(得分:1)
不能完全确定“非常线性随机”是什么意思,但是如果您的数组是3x3,我相信您想使用
const int range = 3;
int random = rand( ) % range; // Get random index [0 - 2]
为您的3x3阵列生成有效的索引。
或者,如果您的棋盘限制为3x3,则可以只创建一个预定义的std :: pair对的std :: vector-然后在每局游戏开始时对向量使用std::(random_)shuffle。这将避免为已经播放的空间生成随机坐标。但是,这种方法在较大的电路板上无法很好地扩展。
示例矢量:
std::vector<std::pair<size_t, size_t>> coords
{
std::pair<size_t, size_t>(0, 0),
std::pair<size_t, size_t>(0, 1),
std::pair<size_t, size_t>(0, 2),
std::pair<size_t, size_t>(1, 0),
// ...
std::pair<size_t, size_t>(2, 2)
};
请参见How to shuffle a std::vector,以获取有关如何对向量进行随机播放的快速示例。