如何将属性随机分布在一定数量的对象上



我想知道在一定数量的对象上分发东西的最佳方式是什么。我正在尝试创建一个扫雷游戏,其中有一定数量的瓦片和一定数量的地雷,但我不确定在一定范围内随机分配数字的最佳方式。

具体地说,如果我有一个向量,比如400个对象,那么随机分配一个布尔属性的最佳方法是什么,这样400个对象中的30个为真,其余为假?

struct Tile {
bool mine;
// ...
};
std::vector<Tile> v(400);

我想的可能是一个概率系统,其中一组数量的瓦片绝对必须具有该属性,我可以创建所有对象的编号向量并滚动随机数,然后从向量中删除这些对象,直到设置了符合要求的地雷数量。

生成具有所需每个值的设置数量的数组,然后对它们进行混洗。

https://en.cppreference.com/w/cpp/algorithm/random_shuffle

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方法和一个单独的随机生成器(在这里阅读更多信息(。但这对于一个简单的游戏来说应该足够好了。

这里要做的是变换向量的随机采样子集。range-v3库具有可用于此目的的views::sample

for (auto & tile : v | ranges::views::sample(30))
tile.mine = true;  

这是一个演示。

这种解决方案的优点是不需要制作矢量的副本,也不需要任何额外的内存。此外,这在不移动矢量中任何对象的情况下也能工作。

该视图计划添加到C++23中,尽管它只是第3层优先级。

最新更新