我想知道在一定数量的物件上分配一些东西的最佳方式是什么。我正在尝试创建一个扫雷游戏,其中有一定数量的瓷砖和一定数量的地雷,但我不确定在一定范围内随机分布数字的最佳方法。
具体来说,如果我有一个包含 400 个物件的矢量,那么随机分布一个布尔属性以便 400 个中的 30 个为真,其余为假的最佳方法是什么?
struct Tile {
bool mine;
// ...
};
std::vector<Tile> v(400);
我在想可能类似于概率系统的东西,其中一定数量的瓷砖绝对必须具有该属性,并且我可以创建所有物件的编号矢量并滚动随机数,然后从矢量中洗掉这些物件直到满足数设定了地雷。
uj5u.com热心网友回复:
使用您想要的设定数量的每个值生成阵列,然后将它们打乱。
https://en.cppreference.com/w/cpp/algorithm/random_shuffle
uj5u.com热心网友回复:
int N = 400;
int numMines = 30;
vector<bool> hasMine;
for(int i = 0; i < N; i ){
if(i < numMines) hasMine.push_back(true);
else hasMine.push_back(false);
}
random_shuffle(hasMine.begin(), hasMine.end());
如果您太在意 shuffle 的准确性,您可以使用带有单独随机生成器的 shuffle 方法(在此处阅读更多相关信息)。但这对于一个简单的游戏来说应该足够了。
uj5u.com热心网友回复:
您在这里尝试做的是转换矢量的随机采样子集。该范围-V3库已views::sample
可用于这一目的:
for (auto & tile : v | ranges::views::sample(30))
tile.mine = true;
这是一个演示。
该解决方案的优点是不需要制作矢量的副本,也不需要任何额外的存储器。此外,这无需在矢量中的任何物件周围移动即可作业。
此视图计划添加到 C 23,尽管它只是第 3 层优先级。
0 评论