我正在尝试编写一个必须随机将一些元素分配给结构的函数。这是我试图做的事情:
void assignTerrains (Player* g, Terrain* c, int n){
int i, j, nRand, terrains_for_player;
terrains_for_player = NTERRAINS / n;
for (i=0; i<n; i++){
for(j=0; j<terrains_for_players; )
do {
nRand = minRand + rand()%(maxRand - minRand + 1);
} while (c[nRand].boxType != Terrain);
c[nRand].idProp = i;
g[i].capital -= c[nRand].cost;
g[i].numTerrains++;
j++
}
}
terrains_for_players是每个玩家将获得的地形数量。地形数量为40,但其中只有24个是可分配的类型(boxType必须是地形)。例如:5个玩家,所以它将是24/5,前四个玩家每个将有5个地形,而最后一个将有4个。地形必须平均分配给每个玩家,并且必须是随机的。所以我生成一个随机数,直到nRand索引处的c为“terrain”类型,然后我做我必须做的操作(从玩家减去钱,并增加他们拥有的地形数量。希望有人可以帮助我!谢谢。
答案 0 :(得分:1)
你的代码很难看(抱歉这么直接)。使用有意义的变量名并正确缩进。
造成这个问题的原因(我想,你不是说你期待的是什么以及你实际得到的结果)就在这里:
do {
nRand = minRand + rand()%(maxRand - minRand + 1);
} while (c[nRand].boxType != Terrain);
c[nRand].idProp = i;
在该循环中,您尝试找到具有正确类型的随机地形,但是您忘记检查您可能找到的地形可能已被其他玩家使用(之前的外环迭代)。将条件改为...... ...
do {
nRand = minRand + rand()%(maxRand - minRand + 1);
} while ((c[nRand].boxType != Terrain) && (c[nRand].idProp != NO_PLAYER));
c[nRand].idProp = i;
......应该解决这个问题。
更好的方式是IMO首先生成可用地形的随机排列,然后让每个玩家选择合适数量的这些。像:
Terrain * suitableTerrains = getThat24SuitableTerrains();
permuteRandom(suitableTerrains); // Using random swapping, choosing random indicies, what ever
size_t nextTerrain = 0;
for (player = 0; player < countPlayers; ++player) {
unsigned terrain;
for (terrain = 0; terrain < terrainsPerPlayer; ++terrain) {
// assign suitableTerrains[nextTerrain] to the player
++nextTerrain;
}
}