我想知道在一定數量的物件上分配一些東西的最佳方式是什么。我正在嘗試創建一個掃雷游戲,其中有一定數量的瓷磚和一定數量的地雷,但我不確定在一定范圍內隨機分布數字的最佳方法。
具體來說,如果我有一個包含 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 層優先級。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/398763.html
上一篇:回傳與呼叫基方法的子類相同的型別
