拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何将属性随机分布在一定数量的物件上?

如何将属性随机分布在一定数量的物件上?

白鹭 - 2022-03-17 1930 0 0

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

具体来说,如果我有一个包含 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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *